В чем разница между сборкой и новой на Rails? - PullRequest
23 голосов
/ 10 августа 2009

Может кто-нибудь сказать мне, в чем разница между сборкой и новой командой на Rails?

Ответы [ 5 ]

54 голосов
/ 10 августа 2009

новый для нового экземпляра конкретной модели:

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

Обновление

В соответствии с предложением, сборкой и новыми в @ 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
17 голосов
/ 09 сентября 2013

Новое и сборка соответствуют документации https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb

1 голос
/ 06 декабря 2016

Было время, когда build заполнял вызывающую программу новым экземпляром, а new - нет. Прямо сейчас из Rails 4 и new, и build заполняют вызывающую программу новым экземпляром. Просто поиграйте в консоль, если хотите получить представление.

1 голос
/ 14 ноября 2016

Я заметил разницу между .build и .new при их использовании для создания «фиктивного» объекта для формы представления с использованием вложенного ресурса.

.build создает parent_id .new не

Пример вложенного ресурса: @ list.items (где Элемент вложен в Список)

@list.items.build ... создает объект со всеми значениями nil, КРОМЕ для list_id.

Item.new создает новый объект item со всеми значениями nil.

Он появился на моей странице 'show' при переборе по @ list.items Не проблема, пока мне не понадобился @ list.items далее по той же странице 'show' в другой форме, где итерация на @ 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>

1 голос
/ 17 января 2012

До появления rails 2.2 вам требовалась сборка для части отношения has_many / has_and_belongs_to_many, чтобы в новой записи автоматически устанавливались внешние ключи. Например:

user.timesheets.build

установит внешний ключ. Я думаю, что для rails 2.2 и выше, new и build делают то же самое для отношений has_many и has_and_belongs_to_many.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...