2012-05-10 3 views
2

Rails 3.x에서 연결 확장이 상당히 변경된 것처럼 보입니다.연결 확장에서 프록시의 소유자에 액세스하는 올바른 방법

프록시 소유자 및 프록시 대상 (예 : has_many 개체 및 belongs_to 개체)에 액세스해야합니다.

대부분이 recent documentation 인 경우 proxy_association.ownerproxy_association.target을 사용합니다. 그러나이 메서드는 없습니다. self.proxy_target이 작동 할 것이라고 말하면서 더 오래된 참조를 발견했습니다 (지금은 찾을 수 없습니다). 그러나 이것은 간헐적으로 작동하는 것으로 보이며 내 지역 환경과 생산간에 이상하지 않습니다 (이상합니다 ... 알고 있습니다).

누구나 협회 확장 내에서 소유자 및 대상에 액세스하는 방법에 대한보다 정확한 답변을 어디에서 찾을 수 있는지 알고 있습니까 레일 3.0.10?

답변

5

proxy_association은 레일 3.1에 새로 추가되었습니다. 레일 3.0.x (및 2.x)는 proxy_ownerproxy_target입니다. 그러나 proxy_target은로드 된 경우 연결을 캐시하는 인스턴스 변수를 반환합니다. 즉, 연결이 아직로드되지 않은 경우 콜렉션 연결에 대해 []이 반환됩니다. 또는 다른 말로, proxy_target를 호출하기 전에 load_target를 호출하여

class Bar < ActiveRecord::Base 
    has_many :foos do 
    def target_test 
     proxy_target 
    end 
    end 
end 

다음

bar = Bar.first 
bar.foos.target_test #=> [] 
bar.foos.inspect 
bar.foos.target_test #=> [#<Foo id: 1 ...>] 

대상을 강제 할 수

로드 할 수

을 부여. 이 모든 것이 왜 중요한지 잘 모르겠습니다. self에 전화하면 내용이 대상으로 전달됩니다.

+0

load_target 트릭을 수행했습니다! 자기 자신에 대한 메소드를 호출하는 것이 왜 효과가 없었는지 확실하지 않습니다. 감사! – CambridgeMike

관련 문제