Tengo 2 modelos. A los efectos de esta sesión de preguntas y respuestas, los llamo Padre e Hijo.

# Parent.rb
class Parent < ApplicationRecord
  has_many :children, dependent: :destroy
  # ...
end

# Child.rb
class Child < ApplicationRecord
  belongs_to :parent
  # ...
end

Los recursos secundarios están anidados dentro de los recursos principales en el archivo de rutas y, por lo tanto, parent_id estará disponible en la ruta secundaria.

# routes.rb
resources :parents do
  resources :children
end

En ciertas acciones del controlador de niños, como actualizar y destruir, es necesario encontrar el registro de revisión correspondiente por su ID.

Desde el punto de vista del desempeño, ¿hará una diferencia material entre los siguientes 2 conjuntos de declaraciones?

# children_controller.rb
@parent = Parent.find(params[:parent_id])
@child  = Child.find(params[:id])    
# or
@parent = Parent.find(params[:parent_id])
@child  = @parent.children.find(params[:id])    
0
Waihon Yew 16 dic. 2016 a las 03:42

2 respuestas

La mejor respuesta

Están llamando al mismo método.

http://apidock.com/rails/ActiveRecord/FinderMethods/find

Asintóticamente, la diferencia de rendimiento es casi insignificante. Ambos son O (1) en complejidad de tiempo porque tiene la clave principal, a diferencia de usar una columna indexada (que sería O (log n)).

Si realmente está buscando ver las pequeñas diferencias, @child = Child.find(params[:id]) es más rápido porque hay menos código para ejecutar. Pero al final del día, no importa.

0
Edmund Lee 16 dic. 2016 a las 00:58

Suponiendo que tiene todos los índices adecuados en su lugar y todo eso, la única diferencia real es que hay una condición de consulta más (y, con suerte, búsqueda de índices) si usa la segunda forma @parent.children.find(id).

Siempre uso este formulario si hay una ruta anidada para asegurarme de que la ruta sea válida. Te recomiendo hacer lo mismo.

0
Michael Chaney 16 dic. 2016 a las 01:34