루비 온 레일즈. : Belongs to Relationship에서 Active Record .build 메소드를 어떻게 사용합니까?


128

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. 이 방법에 대한 문서는 어디서 찾을 수 있습니까?

감사합니다


설명서에 대해서는 Rails Guides " belongs_toAdded Methods has_one""Added Methods by "를 참조하십시오 . 더 많은 기술 문서는 API 문서에서 찾을 수 있습니다 : belongs_tohas_one.
Dennis

답변:


147

문서화되는 곳 :

" 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"메소드와 유사)

레일은 얼마나 똑똑합니까? 그것은 마술이다 (또는 더 정확하게, 나는 단지 모른다, 알고 싶다!)


4
@BushyMark : method_missing 또는 metaporgramming을 사용하여 define_method로 해당 메소드를 추가합니다.
Federico

@Federico 메소드가 누락 된 곳은 어디입니까?
awilkening

1
@ alock27 ActiveRecord가 find_by_emailfind_by_column_name메소드에 누락 된 메소드를 사용하는 방법과 동일 합니다. 문자열에 전달하는 메소드를 변환하여 해부하여 테이블의 열 이름과 일치 시키려고 시도합니다.
bigpotato

@edmund 귀하의 의견에 감사드립니다. 분명히, 나는 method_missing이 어떻게 작동하는지 이해합니다. 누락 된이 특정 방법을 정의하는 파일의 실제 위치를 찾으려고했습니다.
akekening

@ alock27 만약 당신이 그것을 어떻게 정의했는지 조사하기를 원한다면 Metaprogramming Ruby를 확인해야합니다. 그러나 실제로 실제 위치를 찾고 있다면 아마도 소스 코드를 Google에 제공 할 수 있습니다.
MCB

48
@article = user.articles.build(:title => "MainTitle")
@article.save

>> d.tags.build (: number => "123456") >> d.save # => true 동일하지 않습니까?
antiqe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.