[ruby-on-rails] Rails 3의 새로운 기능 vs.

Rails 3 docs 에서 build연결 방법 은 방법과 동일 new하지만 외래 키가 자동으로 할당 된 것으로 설명됩니다 . 문서에서 바로 :

Firm#clients.build (similar to Client.new("firm_id" => id))

나는 다른 곳에서 비슷한 것을 읽었다.

그러나 new(예를 들어 some_firm.clients.new매개 변수없이) 사용 하면 새 클라이언트 firm_id연결 자동으로 생성됩니다. 나는 지금 콘솔에서 결과를 쳐다보고있다!

뭔가 빠졌습니까? 문서가 약간 오래된 것입니까? 차이 무엇 buildnew?



답변

문서를 약간 잘못 읽고 있습니다. some_firm.client.newClient클라이언트 컬렉션에서 새 객체를 생성 하므로 자동으로 firm_idto을 설정할 수 some_firm.id있지만 문서는 전화 Client.new를 걸어 회사의 ID를 전혀 알지 못하므로 firm_id전달해야합니다.

유일한 차이점 some_firm.clients.newsome_firm.clients.build그 것 같다 build또한에 새로 만든 클라이언트를 추가 clients수집 :

henrym:~/testapp$ rails c
Loading development environment (Rails 3.0.4)
r:001 > (some_firm = Firm.new).save # Create and save a new Firm
#=> true 
r:002 > some_firm.clients           # No clients yet
#=> [] 
r:003 > some_firm.clients.new       # Create a new client
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 
r:004 > some_firm.clients           # Still no clients
#=> [] 
r:005 > some_firm.clients.build     # Create a new client with build
#=> #<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil> 
r:006 > some_firm.clients           # New client is added to clients 
#=> [#<Client id: nil, firm_id: 1, created_at: nil, updated_at: nil>] 
r:007 > some_firm.save
#=> true 
r:008 > some_firm.clients           # Saving firm also saves the attached client
#=> [#<Client id: 1, firm_id: 1, created_at: "2011-02-11 00:18:47",
updated_at: "2011-02-11 00:18:47">] 

연결을 통해 객체를 생성하는 경우 빌드시 메모리에있는 객체 (이 경우)가 객체가 데이터베이스에 저장되기 전에도 일관성있는 상태로 유지 build되므로 선호하는 것이 좋습니다 .newsome_firm


답변

build에 대한 별명입니다 new.

alias build new

전체 코드는 https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74 에서 찾을 수 있습니다.


답변

맞습니다. 빌드 및 새 함수는 연결을 통해 호출 될 때 외래 키를 설정하는 것과 동일한 효과를 갖습니다. 문서가 이와 같이 작성된 이유는 새로운 활성 레코드 관계가 아닌 새로운 클라이언트 객체가 인스턴스화되고 있음을 분명히하기 위해서입니다. 이것은 클래스에서 .new를 호출하는 것이 Ruby에서와 동일한 효과입니다. 즉, 연결에서 빌드를 호출하는 것이 동일하다는 것을 문서에서 설명하고 있으며 새 객체를 만들고 (.new를 호출) 외래 키를 해당 객체에 전달합니다. 이 명령은 모두 동일합니다.

Firm.first.clients.build
Firm.first.clients.new
Client.new(:firm_id => Firm.first.id)

.build가 존재하는 이유는 Firm.first.clients.new가 실제 클라이언트가 아닌 새로운 has_many 관계 객체를 생성한다는 의미로 해석 될 수 있기 때문에 .build를 호출하는 것이 이것을 명확히하는 방법입니다.


답변

buildvs new:

대부분 새롭고 빌드는 동일하지만 빌드 저장소 객체를 메모리에 저장합니다 .

예 :

새로운

Client.new(:firm_id=>Firm.first.id)

빌드의 경우 :

Firm.first.clients.build

여기서 클라이언트는 메모리에 저장되며, 회사를 저장하면 관련 레코드도 저장됩니다.


답변

Model.new

Tag.new post_id: 1post_id세트 로 태그를 인스턴스화합니다 .

@ model.models.new

@post.tags.build같은 않습니다 인스턴스화 된 태그에있는 것 @post.tags이 저장되는도 전에.

@post.save, @post와 새로 작성된 태그를 모두 저장합니다 (: inverse_of가 설정되어 있다고 가정). Rails는 저장하기 전에 두 객체의 유효성을 검사하고 둘 중 하나라도 유효성 검사에 실패하면 저장되지 않기 때문에 좋습니다.

models.new 대 models.build

@post.tags.build@post.tags.new(적어도 레일 3.2) 이후 동일하다.


답변