[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를 가지지 않기 때문에 설정되지 않습니다.

내 질문은 :

  1. Rails가 레코드를 올바른 순서로 저장하는 방법을 알아낼 수있을 정도로 똑똑해 지려면 어떻게해야합니까?

  2. belongs_to관계 에서 어떻게 똑같은 일을 할 수 있습니까?

  3. 이 방법에 대한 문서는 어디서 찾을 수 있습니까?

감사합니다



답변

문서화되는 곳 :

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


답변