2009-06-04 2 views
0

나는 여러 연결을 함께 연결하는 여러 클래스가 있으며 최상위 개체를 가져 와서 닫고 모든 하위 개체를 닫을 수 있기를 바랍니다. 부모를 골라서 모두 닫을 수 있기를 원하기 때문에 각 개체를 닫아야합니다.레일스 연결 - 케스 케이 딩 업데이트

예 (I이 아마 존재하지 않습니다 실현)의 경우 :

class Requisition 
    has_many :shipments, :dependent_method => :close 
end 

class Shipment 
    belongs_to :requisition 

    has_many :reroutes, :dependent_method => :close 
end 

class Reroute 
    belongs_to :shipment 

    has_many :deliveries, :dependent_method => :close 
end 

class Delivery 
    belongs_to :reroute 
end 

이 사람이 좋은 해결책을 알고 있나요

이를 달성하기 위해? 보석/플러그인은 완벽하게 수용 될 수 있습니다 :-)

고마워요!

+0

항목을 "닫아서"그것을 없애거나 닫음 = 참을하는 것입니까? – Matchu

+0

개체를 닫을 때 해당 개체의 현재 날짜를 dateClosed 특성으로 설정하고 자식 개체가 동일하게 처리되기를 원합니다. –

답변

0

나는 앉아서 이것을하기 위해 약간의 플러그인을 작성했다. 나는 그것을 acts_as_closable이라고 부르며 단순히 다음과 같은 메서드를 before_save 필터에 추가합니다. 이 작업을 수행하려는 각 연결에 대해 :autosave => true을 사용해야하지만 acts_as_closable이 자동으로 연결을 저장하는 대신 나에게 의미가 있습니다. 나중에 옵션으로 만들고 코드를 공개 할 수 있습니다. 여기에 고기 :

def update_closed_status_of_children 
    [self.class.reflect_on_all_associations(:has_many), self.class.reflect_on_all_associations(:has_one)].flatten.each do |assoc| 

    # Don't consider :through associations since those should be handled in 
    # the associated class 
    if not (assoc.options.include? :through) 
     attribute = self.class.acts_as_closable_config.closed_attribute 
     children = self.send(assoc.name) 
     children = Array(children).flatten.compact 

     children.each do |child| 
     # Check to make sure we're only doing this on something declaring acts_as_closable 
     if child.class.included_modules.include? ActsAsClosable 
      child.send(:closed_value=, self.closed_value) 
     end 
     end 
    end 

    end 
end 

내가 다른 방법 ( :closed_value=:closed? 등)를 정의하지만 내가 알아 내려고했던 주요 코드입니다. 희망은 다른 사람을 돕는다!

+1

대부분의 사용자에게는 의미가 없지만 일부 종류의 캐스케이드 업데이터는 '추상적'이 아니라 추상적으로 만드는 것이 훨씬 더 낫습니다. – RocketR

+0

@RocketR - 사실! 죄송합니다. 2 년 전 게시했습니다. 아무도 실제로 아무 말도하지 않았기 때문에 나는 그것에 대해 생각하지 않았습니다. 생각해 보니 코드에 더 이상 액세스 할 수 없다고 생각합니다. 내가 앞으로 어떤 비슷한 일을한다면, 나는 풀 보석을 만들고 그것을 풀어 놓고이 질문을 업데이트 할 것이다 :-) –

0

귀하의 목표를 이해하기 어렵습니다. "가까운"뜻을 분명히 할 수 있다면 도움이 될 것입니다.

다음 정보는 귀하의 질문에 대한 답변입니다.

ActiveRecord는 '저장'및 '저장'을 통해 데이터베이스에 대한 지속성 개념을 가지고 있습니다. 행동 양식. 기본적으로 연관 객체는 부모 객체가 저장 될 때 저장됩니다. 실제로 다음 방금 dateClosed을 수행하는 방법을 32 파괴 덮어 쓸 수있는 방법을 파괴하고 사용하여 DB에서 행을 삭제하지 않을 경우

+0

그래서 연관이 자동으로 저장되면'before_save' 메서드를 무시하고 부모 (있는 경우)에 dateClosed 속성이 nil이 아닌 다른 값으로 설정되어 있는지 확인할 수 있습니다. 그렇다면 광산을 설정하십시오. 이게 합리적이라고 생각하니? –

+0

P. 오브젝트를 '닫는'것에 대한 더 자세한 설명은 위의 질문에 대한 설명을 참조하십시오. 감사! –

+0

더 나은 방법은 연결 콜백을 사용하는 것입니다. 연관 콜백은 부모 객체와 연관되어 자식 속성을 설정합니다. http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html로 이동하여 "저장되지 않은 개체 및 연결"에 대한 검색을 수행하십시오. '연결 콜백'섹션을 검토해야하지만 이전 두 섹션도 관련성이 있습니다. –

0

나는 믿습니다 의존 => : 바로 호출 파괴 관련 개체는 방법을 파괴

def destroy 
    dateClosed = Date.today 
end 

class Requisition has_many :shipments, :dependent => :destroy 
+0

나는 그것을 고려하지 않았지만 실제로는 객체를 파괴해야하므로 불행하게도 작동하지 않습니다. 나는 현재 그것을 처리하기 위해 내 자신의 플러그인을 쓰고 있는데, 제대로 작동하도록 아주 가깝다. 완료되면 업데이트를 게시합니다. –