Может ли кто-нибудь сказать мне, в чем разница между сборкой и новой командой в Rails?
В чем разница между сборкой и новой версией Rails?
Ответ 1
new для нового экземпляра конкретной модели:
foo = Foo.new
build предназначен для создания нового экземпляра в AR-ассоциации:
bar = foo.build_bar # (has_one or belongs_to)
или
bar = foo.bars.build # (has\_many, habtm or has_many :through)
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Обновление
Per @toklands предложение, сборка и новые - это псевдонимы, как определено в ActiveRecord:: Relation:
Итак, если класс Foo has_many Bars, следующие имеют одинаковые эффекты:
-
foo.bars.new
<= >foo.bars.build
-
Bar.where(:foo_id=>foo.id).new
<= >Bar.where(:foo_id=>foo.id).build
И если !foo.new_record?
-
foo.bars.new
<= >Bar.where(:foo_id=>foo.id).new
Ответ 2
Новые и сборка такие же, как в документации https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb
Ответ 3
До рельсов 2.2 вам понадобилось построить для has_many/has_and_belongs_to_many часть отношения, чтобы новая запись автоматически установила внешние ключи. Например:
user.timesheets.build
установит внешний ключ. Я думаю, что для рельсов 2.2 и далее новые и строить делают то же самое для has_many и has_and_belongs_to_many отношений.
Ответ 4
Я заметил разницу между .build и .new при использовании их для создания объекта 'dummy' для формы представления, используя использование вложенного ресурса.
.build создает parent_id .new не
Пример вложенного ресурса: @list.items(где Item вложен в список)
@list.items.build ... создает объект со всеми значениями nil EXCEPT для list_id.
Item.new создает новый объект item со всеми значениями nil.
Он появился на моей странице "show" при повторении по списку @list.items Не проблема, пока мне не понадобился @list.items далее на той же странице "показать" в другой форме, где итерация в @list.items открыла элемент (тот, который был создан .build), который имел связанный list_id, но ничего больше.
Некоторые примеры выходов ниже...
@list.items.build = > #
2.2.3: 002 > Item.all.build = > #
2.2.3: 003 > Item.new = > # 2.2.3: 004 >
Ответ 5
Было время, когда сборка заполнила вызывающего абонента новым экземпляром, но новый - нет. Прямо сейчас из Rails 4 и новые, и сборщики заполняют вызывающего абонента новым экземпляром. Просто играйте в консоли, если хотите получить представление.