2012-04-11 3 views
0

중첩 된 속성을 통해 레코드를 저장하면 가상 속성이 하위 모델에서 설정되지 않습니다.accepts_nested_attributes_for를 통해 저장할 때 가상 속성은 nil입니다.

class Person < ActiveRecord::Base 
    has_many :houses 
    accepts_nested_attributes_for :houses 
end 

class House < ActiveRecord::Base 
    attr_accessor :house_name #virtual 
    before_save do 
    puts attributes # doesn't include house_name when saving through parent model 
    puts @house_name # nil when saving through parent model 
    end 

end 

person = Person.find(1) 
person.houses.count #=> 3 
person.houses.first.house_name = 'crazy house' 
person.save # house_name not in attributes 

house = person.houses.first 
house.house_name = 'moms house' 
house.save #house_name is in attributes 

답변

0

귀하의 코드 :

person.houses.first.house_name = 'crazy house' 

첫 번째 관련된 House를 가져옵니다. Person은 집을 바꾼다는 것을 알 길이 없습니다. 너는 단지 그 마술을 과대 평가했다. 필요한 것은 집의 update_attributes입니다 :

person.houses.first.update_attributes house_name: 'crazy house' 
+0

그 의미가 있습니다. params 해시를 저장하면 동일할까요? 즉 - @ person.update_attributes (params [: person]) –

+0

'house_name : 'crazy house''는'해시 (Hash)'이므로 대신 자신의 것을 제공 할 수 있습니다. – jdoe

+0

맞지만 그 집은 부모 개체를 통하지 않고 그냥 집을 업데이트하는 것입니다. –

관련 문제