Rails 3의 새로운 기능 vs.


125

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

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

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

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

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


3
빠른 답변을 찾는 사람들은 두 번째 질문을 확인하십시오. "build"는 "new"의 별칭입니다
ivanreese

답변:


208

문서를 약간 잘못 읽고 있습니다. 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


8
를 사용 some_firm.client.new하여에 클라이언트를 추가 some_firm.clients하고를 호출 save하면 유효하지 some_firm않음을 나타내는 유효성 검사 오류가 발생했습니다 client. 두 경우 new와는 build새 클라이언트를 추가 some_firm의 클라이언트 수집, 무슨 않는 build그 그렇게 new하지 않는다? 조밀해서 죄송합니다.
ClosureCowboy

1
+1 3.0.4로 결과를 받았습니다. 3.0.3을 가진 사람이 내가 미쳤다고 확인할 수 있으면 좋겠다.
ClosureCowboy

41
@henrym 3.2.6 에서처럼 보입니다. clients.new와 clients.build는 새로운 객체를 컬렉션에 추가한다는 점에서 비슷합니다. 나는 같은 인터넷 검색이 한 동안이 건너 온 사람에 대한 코멘트 추가하고 싶었
허바드

11
Rails 3.2.3에서 그들 사이에 차이가없는 것 같습니다
Aditya Kapoor

4
이 답변은 Rails> 3.2.13에서는 정확하지 않습니다. 여기서 'build'는 'new'의 별칭 일뿐입니다. 아래 @HatemMahmoud의 답변을 참조하십시오.
Andreas

91

build에 대한 별명입니다 new.

alias build new

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


13
alias build new레일 기준 3.2.13
fontno

7
이것은 일부 협회 / 관계에만 해당됩니다. 단수 협회는, 예를 들어, 전적으로 다른 정의가 buildbuild_#{association}. 여기여기를 참조 하십시오 .
coreyward

1
이것은 여전히 ​​사실 Rails 4입니까?
fatman13

1
다음 은 버그 보고서입니다. 레스토랑과 같은 범위를 사용하기 위해 restaurant.customers에 추가하지 않고 식당과 관련된 새로운 고객을 얻는 방법으로 restaurant.customers.new와 같은 새로운 것을 사용하고 있는지 제안합니다. .customers.scoped.new
user3334690

11

맞습니다. 빌드 및 새 함수는 연결을 통해 호출 될 때 외래 키를 설정하는 것과 동일한 효과를 갖습니다. 문서가 이와 같이 작성된 이유는 새로운 활성 레코드 관계가 아닌 새로운 클라이언트 객체가 인스턴스화되고 있음을 분명히하기 위해서입니다. 이것은 클래스에서 .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를 호출하는 것이 이것을 명확히하는 방법입니다.


그래서 그들은 이다 동등한. 그것은 분명히 보이는 것입니다. 감사합니다!
ClosureCowboy

5
이것은 정확하지 않습니다. 처음 두 버전은 이후 버전의 Rails에서 동일합니다 (게시 시점과 같지 않음). 그러나 마지막 것은 Firm.first.clients에 새 클라이언트가 포함되지 않는다는 점에서 큰 차이가 있습니다.
tybro0103

4

buildvs new:

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

예 :

새로운

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

빌드의 경우 :

Firm.first.clients.build

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


2

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) 이후 동일하다.


이건 The only difference between some_firm.clients.new and some_firm.clients.build seems to be that build also adds the newly-created client to the clients collection:어때?
쿠스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.