[ruby-on-rails] 루비 온 레일즈. : Belongs to Relationship에서 Active Record .build 메소드를 어떻게 사용합니까?
Rails의 .build 메소드에 대한 문서를 찾을 수 없습니다 (현재 2.0.2를 사용하고 있습니다).
실험을 통해 빌드 방법을 사용하여 레코드를 has_many
저장하기 전에 관계에 레코드를 추가 할 수 있습니다 .
예를 들면 다음과 같습니다.
class Dog < ActiveRecord::Base
has_many :tags
belongs_to :person
end
class Person < ActiveRecord::Base
has_many :dogs
end
# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true
이렇게하면 외래 키가있는 개와 태그가 올바르게 저장됩니다. 이것은 belongs_to
관계 에서 작동하지 않는 것 같습니다 .
d = Dog.new
d.person.build # => nil object on nil.build
나는 또한 시도했다
d = Dog.new
d.person = Person.new
d.save # => true
이 경우 외래 키 Dog
는 저장 될 때 새 사람이 아직 저장되지 않았기 때문에 ID를 가지지 않기 때문에 설정되지 않습니다.
내 질문은 :
-
Rails가 레코드를 올바른 순서로 저장하는 방법을 알아낼 수있을 정도로 똑똑해 지려면 어떻게해야합니까?
-
belongs_to
관계 에서 어떻게 똑같은 일을 할 수 있습니까? -
이 방법에 대한 문서는 어디서 찾을 수 있습니까?
감사합니다
답변
문서화되는 곳 :
” Module ActiveRecord :: Associations :: ClassMethods ” 의 has_many 연관 아래 API 문서에서
collection.build (attributes = {},…) 속성으로 인스턴스화되고 외래 키를 통해이 객체에 링크되었지만 아직 저장되지 않은 하나 이상의 컬렉션 유형의 새 객체를 반환합니다. 참고 : 이것은 연결된 객체가 이미 존재하는 경우에만 작동합니다.
반대 방향으로 구축하는 것에 대한 대답은 약간 변경된 구문입니다. 개들의 예에서
Class Dog
has_many :tags
belongs_to :person
end
Class Person
has_many :dogs
end
d = Dog.new
d.build_person(:attributes => "go", :here => "like normal")
또는
t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")
create_dog을 사용하여 즉시 저장하도록 할 수도 있습니다 (컬렉션에서 호출 할 수있는 해당 “create”메소드와 유사)
레일은 얼마나 똑똑합니까? 그것은 마술이다 (또는 더 정확하게, 나는 단지 모른다, 알고 싶다!)
답변
@article = user.articles.build(:title => "MainTitle")
@article.save