В Rails 3 Docs , то build
метод ассоциаций описывается как такой же , как new
метод, но с автоматическим присвоением внешнего ключа. Прямо из документации:
Firm#clients.build (similar to Client.new("firm_id" => id))
Я читал подобное в другом месте.
Однако, когда я использую new
(например , some_firm.clients.new
без каких - либо параметров), нового клиента firm_id
ассоциация будет создана автоматически. Я прямо сейчас смотрю на результаты в консоли!
Я что-то упускаю? Документы немного устарели (маловероятно)? В чем разница между build
и new
?
ruby-on-rails
ruby-on-rails-3
associations
ClosureCowboy
источник
источник
Ответы:
Вы немного неправильно читаете документы.
some_firm.client.new
создает новыйClient
объект из коллекции клиентов, и поэтому он может автоматически установитьfirm_id
значениеsome_firm.id
, тогда как вызываются документы,Client.new
которые вообще не знают идентификатора какой-либо фирмы, поэтому ему нужноfirm_id
передать ему.Единственная разница между
some_firm.clients.new
и,some_firm.clients.build
похоже, состоит в том, чтоbuild
вclients
коллекцию также добавляется вновь созданный клиент :Если вы создаете объект через ассоциацию, это
build
должно быть предпочтительнее, такnew
как сборка сохраняет ваш объект в памятиsome_firm
(в данном случае) в согласованном состоянии даже до того, как какие-либо объекты были сохранены в базе данных.источник
some_firm.client.new
также добавляет клиент кsome_firm.clients
, и вызовsave
наsome_firm
в результате ошибки проверки , указывающей , чтоclient
является недопустимым. Если обаnew
иbuild
добавить нового клиента вsome_firm
коллекцию клиентов, чтоbuild
делать, чтоnew
не делает? Простите за то, что был тупицей, здесь!build
это просто псевдоним дляnew
:Полный код можно найти: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74
источник
alias build new
as of rails 3.2.13build
иbuild_#{association}
. Смотрите здесь и здесь .Rails 4
?Вы правы, функции build и new имеют одинаковый эффект установки внешнего ключа, когда они вызываются через ассоциацию. Я считаю, что причина, по которой документация написана таким образом, состоит в том, чтобы уточнить, что создается новый объект Client, а не отношения новой активной записи. Это тот же эффект, что и вызов .new для класса в Ruby. Это означает, что в документации разъясняется, что вызов построения на основе ассоциации - это то же самое, что и создание нового объекта (вызов .new) и передача внешних ключей этому объекту. Все эти команды эквивалентны:
Я считаю, что причина .build существует в том, что Firm.first.clients.new может интерпретироваться как означающее, что вы создаете новый объект отношения has_many, а не фактического клиента, поэтому вызов .build - это способ прояснить это.
источник
build
противnew
:например:
для новых:
Для сборки:
Здесь клиенты хранятся в памяти, при сохранении фирмы также сохраняются связанные записи.
источник
Model.new
Tag.new post_id: 1
создаст экземпляр тега с егоpost_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
эквивалентны (по крайней мере, начиная с Rails 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:
?