2011-02-16 6 views
0

레일에 중첩 된 개체가 있습니다. 사용자 -> has_many : 작업 -> has_one : 위치.자식 개체의 값을 얻는 방법

어제, 위치 값을 작업에 연결하는 데 문제가 있다고 생각했지만 지금은 출력 값도 표시 할 수 없다는 것을 알았습니다.

나는 나에게 주소 필드를 줄 것이다

 
<%= task.locations.address %> 

레일을 사용하는 경우

 
--- !ruby/object:Location 
attributes: 
    id: "1" 
    address: "testing address" 
    city: "chicago" 
attributes_cache: {} 

changed_attributes: {} 

etc. etc. etc. 

그래서 내가 생각

 
<%= for task in @user.tasks %> 
     <%= debug task.locations %> 
<% end %> 

출력 디버그를 통해 출력을 얻을 수 있습니다. 하지만 난

undefined method 'address' for nil:NilClass

내가 뭘 잘못했는지에 대한 제안? 모델을 포함

---------- 업데이트 ---------------- 작업에 대한 나의 모델은 & 위치를

 
class Task < ActiveRecord::Base 
    attr_accessible :user_id, :date, :description, :location_id 

    belongs_to :user 
    has_one :location 
end 

class Location < ActiveRecord::Base 
    attr_accessible :address, :city, :state, :zip 

    has_many :tasks 
end 

답변

2

있습니다 작업 has_one 위치 인 경우 has_one은 컬렉션이 아닌 실제 개체를 반환하므로 위치 끝에 s이없는 task.location.address을 수행해야합니다. 주소 방법을 부르기 전에 위치가 존재하는지 확인해야합니다. 그렇지 않으면 위치가 잘못되었을 때 오류가 발생합니다. try 메소드 (예 : task.location.try(:address))에 관심이있을 수 있습니다.

+0

나는 당신이 무엇을보고 있는지보고 내 모델을 보여주기 위해 질문을 업데이트했습니다. 불행히도이 방법으로는 문제가 해결되지 않습니다. 중첩 모델을 사용할 수 있는지, 레일이 예상하는 레일 위치 또는 위치를 보여줄 수 있습니까? – pedalpete

+0

당신의 작업은 'has_one' 위치입니까, 아니면'belongs_to' 위치입니까? 당신의 작업이 테이블에 location_id를 가지고 있다면, 그것은'belongs_to' 위치입니다. 당신은 당신의 관계 모델을'user.tasks.each {| task | task.location}' – christianblais

+0

Phew !! 그건 오래지만, 당신은 그것을 해결! 나는 길을 잃었고 물건이 거의 작동하는 곳으로 돌아갈 수 없었다. (새로운 지점을 만드는 것을 잊어 버렸다.) 어쨌든, 당신은 'belongs_to'에 대해 옳습니다. 그것이 나에게 이상하게 보이는 이유는 위치 테이블이 별도의 위치 그룹이며 사용자가 위치에 대한 연관성을 만들고 있기 때문에 작업에 실제로 위치가 '속하지'않으므로 작업에 위치가 있다고 생각했습니다. 나는 has_and_belongs_to_many가 필요할지도 모른다. 동일한 위치는 많은 다른 업무에 속할 것입니다. 그 확인은? – pedalpete

관련 문제