through references rails query left includes has_one has_and_belongs_to_many active ruby-on-rails ruby activerecord

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.



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