2012-11-24 1 views
3

저는 ROR을 처음 사용하고 있으며화물 추적 프로젝트 작업을하고 있습니다. 아이디어는 선적 위치에 대한 모든 변경 사항을 기록하여 사용자가 추적 번호로 선적을 추적 할 때 현재 위치와 통과 된 내역을 볼 수 있도록하는 것입니다.레일 : 테이블 삽입/업데이트에 대한 감사 구현

나는 shipments 테이블과 shipment_locations 테이블을 가지고 있습니다.

  1. 선적

    +--------------------------+--------------+------+-----+---------+----------------+ 
    | Field     | Type   | Null | Key | Default | Extra   | 
    +--------------------------+--------------+------+-----+---------+----------------+ 
    | id      | int(11)  | NO | PRI | NULL | auto_increment | 
    | start_address_id   | int(11)  | YES |  | NULL |    | 
    | end_address_id   | int(11)  | YES |  | NULL |    | 
    | transportation_agency_id | int(11)  | YES | MUL | NULL |    | 
    | customer_id    | int(11)  | NO | MUL | NULL |    | 
    | status_id    | int(11)  | NO | MUL | NULL |    | 
    | cargo_id     | int(11)  | YES | MUL | NULL |    | 
    | tracking_number   | varchar(255) | NO | MUL | NULL |    | 
    | mode_of_transport_id  | int(11)  | YES | MUL | NULL |    | 
    | expected_start_date  | date   | YES |  | NULL |    | 
    | actual_start_date  | date   | YES |  | NULL |    | 
    | expected_end_date  | date   | YES |  | NULL |    | 
    | actual_end_date   | date   | YES |  | NULL |    | 
    | created_at    | datetime  | NO |  | NULL |    | 
    | updated_at    | datetime  | NO |  | NULL |    | 
    | admin_user_id   | int(11)  | YES | MUL | NULL |    | 
    +--------------------------+--------------+------+-----+---------+----------------+ 
    
  2. shipment_locations :

    +------------------+--------------+------+-----+---------+----------------+ 
    | Field   | Type   | Null | Key | Default | Extra   | 
    +------------------+--------------+------+-----+---------+----------------+ 
    | id    | int(11)  | NO | PRI | NULL | auto_increment | 
    | shipment_id  | int(11)  | NO | MUL | NULL |    | 
    | current_location | varchar(255) | YES |  | NULL |    | 
    | final_location | text   | YES |  | NULL |    | 
    | created_at  | datetime  | NO |  | NULL |    | 
    | updated_at  | datetime  | NO |  | NULL |    | 
    +------------------+--------------+------+-----+---------+----------------+ 
    
  3. Shipment_history이 (제안)

    필드 (위치 업데이트 (CURRENT_LOCATION)에서,이 테이블에 완료)

    • ID
    • 내가이 기록 테이블에 shipment_locations 테이블의 모든 업데이트를 저장하고 싶은

updated_at

  • CURRENT_LOCATION
  • created_at에게
  • 을 shipment_id 사용자가 할 수 있도록 얻으세요 :

    Time (Updated_at):----------------------------> Location:(current_location) 
    1/12/2012 11:30         222 John st. 
    1/12/2012 13:00         555 Paul st. 
    1/13/2012 07:30         final_location 
    

    컨트롤러에서 어떻게 이것을 수행하여 하나의 업데이트 작업 만 기록 테이블에 저장되도록 할 수 있습니까?

    UPDATE :

    나는이 트리거를 사용하여 배송 추적 로그를 얻을 수있었습니다, 감사 vladr

    DELIMITER $$

    DROP 트리거 업데이트 후 트리거 shipment_after_update을 만들 shipment_after_update $$

    on shipments 각 행에 대해 BEGIN INSERT INTO cargo_transit_histories (shipment_id, current_location, final_location, updated_at) VALUES (NEW.id, NEW.current_location, NEW.final_location, NOW()); END $$

    DELIMITER;

  • +0

    또한 (1) 데이터베이스 트리거 사용, (2) * 버전 관리 * 등의 장단점을 별도의 감사 테이블 대신 사용하는 것이 좋습니다 – vladr

    +0

    감사합니다. vladr 감사합니다. 트리거 사용에 대한 조사를 이것을하는 더 청결한 방법. 하지만 트리거를 사용하면 별도의 테이블이 있어야합니다. – Andy7

    +0

    트리거를 사용하면 트리거 내부에서 원하는 모든 작업을 수행 할 수 있습니다. 또한 http://stackoverflow.com/questions/5346367/object-versioning-in-rails-like-papertrail-but-individual-tables 및 http://stackoverflow.com/questions/1697456/versioning-of-models를 참조하십시오. -in-ruby-on-rails – vladr

    답변

    0

    나는 당신이 맞았는지 잘 모르겠지만 좋은 접근 방법이라면 시도 할 것입니다. shipment_history를 shipment_locations에 속하게하는 것이 좋습니다.

    그래서 shipment_history에 shipment_locations_id가있는 경우 after_update 콜백을 사용하여 필요한 것을 설정할 수 있습니다.

    배송지.모델 :

     #your other code 
        after_update :track_changes_in_history 
    
        def track_changes_in_history 
          @shipment_history=Shipment_history.where(:shipment_locations_id=>self.id).first_or_create! 
    @shipment_history.current_location = self.current_location 
    #so on 
        end 
    

    하지만 여기에 모델 속성에는 시간의 상태를 표시하는 방법이 없습니다. 이를 위해서는 has_many 선언으로 다른 모든 모델에 속하는 예를 들어 Map location:string 모델을 별도로 설정하는 것이 더 좋으며이 발송물에 속하는 위치를 주문하여 이력 상태를 표시 할 수있는 것보다 더 좋을 것입니다.