Na szynach 3 Dokumenty The build
Sposób związków jest opisana jako taka sama jak new
sposób, ale z automatycznego przypisywania obcego klucza. Prosto z dokumentacji:
Firm#clients.build (similar to Client.new("firm_id" => id))
Czytałem podobne gdzie indziej.
Jednak gdy używam new
(np. some_firm.clients.new
Bez żadnych parametrów), automatycznie tworzone jestfirm_id
skojarzenie nowego klienta . Patrzę teraz na wyniki w konsoli!
Czy coś mi brakuje? Czy dokumenty są nieco nieaktualne (mało prawdopodobne)? Jaka jest różnica między build
i new
?
ruby-on-rails
ruby-on-rails-3
associations
Zamknięcie Cowboy
źródło
źródło
Odpowiedzi:
Lekko źle odczytujesz dokumenty.
some_firm.client.new
tworzy nowyClient
obiekt z kolekcji klientów, więc może automatycznie ustawićfirm_id
tosome_firm.id
, podczas gdy wzywają dokumenty,Client.new
które nie mają żadnej wiedzy o identyfikatorze żadnej firmy, więc wymagafirm_id
przekazania do niego.Jedyną różnicą między
some_firm.clients.new
isome_firm.clients.build
wydaje się być to, żebuild
dodaje również nowo utworzonego klienta doclients
kolekcji:Jeśli tworzysz obiekt przez skojarzenie,
build
powinno być preferowane,new
ponieważ kompilacja utrzymuje obiekt w pamięcisome_firm
(w tym przypadku) w spójnym stanie, nawet zanim jakiekolwiek obiekty zostaną zapisane w bazie danych.źródło
some_firm.client.new
również dodaje do klientasome_firm.clients
, i wzywającsave
nasome_firm
spowodowało błędu walidacji wskazując, żeclient
był nieprawidłowy. Jeśli obanew
ibuild
dodasz nowego klienta dosome_firm
kolekcji klientów, czego tobuild
nienew
daje? Przepraszam, że jestem gęsty!build
to tylko alias dlanew
:Pełny kod można znaleźć: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74
źródło
alias build new
jak z szyn 3.2.13build
ibuild_#{association}
. Zobacz tutaj i tutaj .Rails 4
?Masz rację, kompilacja i nowe funkcje mają taki sam efekt, jak ustawienie klucza obcego, gdy są wywoływane przez skojarzenie. Uważam, że dokumentacja została napisana w ten sposób, aby wyjaśnić, że tworzona jest instancja nowego obiektu klienta, w przeciwieństwie do nowej relacji aktywnego rekordu. Jest to ten sam efekt, który wywołanie .new w klasie miałoby w Rubim. Oznacza to, że dokumentacja wyjaśnia, że wywołanie build na asocjacji jest tym samym, co utworzenie nowego obiektu (wywołanie .new) i przekazanie kluczy obcych do tego obiektu. Te polecenia są równoważne:
Uważam, że powodem istnienia .build jest to, że Firm.first.clients.new może być interpretowane jako oznaczające, że tworzysz nowy obiekt relacji has_many, a nie rzeczywistego klienta, więc wywołanie .build jest sposobem na wyjaśnienie tego.
źródło
build
vsnew
:na przykład:
dla nowych:
Do budowy:
Tutaj klienci są przechowywani w pamięci, podczas zapisywania firmy zapisywane są również powiązane rekordy.
źródło
Model.new
Tag.new post_id: 1
utworzy wystąpienie tagu z jegopost_id
zestawem.@ model.models.new
@post.tags.build
robi to samo ORAZ utworzony Tag będzie w nim@post.tags
jeszcze przed zapisaniem.Oznacza to,
@post.save
że zapisze zarówno @post, jak i nowo utworzony tag (zakładając, że ustawione jest: inverse_of). Jest to świetne, ponieważ Railsy sprawdzą poprawność obu obiektów przed zapisaniem i żaden nie zostanie zapisany, jeśli któryś z nich nie przejdzie walidacji.models.new vs models.build
@post.tags.build
i@post.tags.new
są równoważne (przynajmniej od Railsów 3.2).źródło
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:
?