ruby-on-rails - query - rails references
¿Cuál es la diferencia entre build y new en Rails? (5)
¿Alguien puede decirme cuál es la diferencia entre la compilación y el nuevo comando en Rails?
Antes de Rails 2.2, necesitabas construir para la parte has_many / has_and_belongs_to_many de la relación para que el nuevo registro tenga automáticamente sus claves foráneas establecidas. Por ejemplo:
user.timesheets.build
establecería la clave externa. Creo que para rails 2.2 y posteriores, new y build hacen lo mismo para has_many y has_and_belongs_to_ many relaciones.
Hubo un momento en que la generación llenaba la persona que llamaba con la nueva instancia pero la nueva no. En este momento desde Rails 4, tanto new como build pueblan a la persona que llama con la nueva instancia. Solo juega en la consola si quieres hacerte una idea.
Los nuevos y compilados son los mismos que los que se encuentran en la documentación https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb
Observé una diferencia entre .build y .new al usarlos para crear un objeto "ficticio" para un formulario de vista, utilizando un recurso anidado usando.
.build crea un parent_id .new no lo hace
Ejemplo de recurso anidado: @ list.items (donde Item está anidado bajo Lista)
@ list.items.build ... produce un objeto con todos los valores nulos EXCEPTO para list_id.
Item.new crea un nuevo objeto item, con todos los valores nulos.
Apareció en mi página ''show'' al iterar sobre @ list.items. No fue un problema hasta que necesité @ list.items más abajo en la misma página ''show'' en otro formulario, donde la iteración en @ list.items expuso el elemento (el producido por .build) que tenía un list_id asociado, pero nada más.
Algunos ejemplos de resultados a continuación ...
@ list.items.build => #
2.2.3: 002> Item.all.build => #
2.2.3: 003> Item.new => # 2.2.3: 004>
nuevo es para una nueva instancia de un modelo específico:
foo = Foo.new
build es para crear una nueva instancia dentro de una asociación de AR:
bar = foo.build_bar # (has_one or belongs_to)
o
bar = foo.bars.build # (has/_many, habtm or has_many :through)
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Actualizar
La sugerencia, compilación y nuevos de Per @ toklands son alias como se define en ActiveRecord::Relation :
Entonces, si la clase Foo tiene_muchas barras, las siguientes tienen efectos idénticos:
-
foo.bars.new
<=>foo.bars.build
-
Bar.where(:foo_id=>foo.id).new
Bar.where(:foo_id=>foo.id).build
<=>Bar.where(:foo_id=>foo.id).build
Y si !foo.new_record?
-
foo.bars.new
<=>Bar.where(:foo_id=>foo.id).new