ruby-on-rails - many - rails foreign key
Advertencia obsoleta para Rails 4 has_many con el fin (4)
Alternativamente, puede poner la cláusula de order
en el modelo, por ejemplo:
has_many :options, order: ''name'' # In class Answer
Se convierte
has_many :options # In class Answer
default_scope { order ''name'' } # In class Option
PD: Obtuve ArgumentError: wrong number of arguments (1 for 0)
al hacer has_many :things, -> {}
.
class RelatedList < ActiveRecord::Base
extend Enumerize
enumerize :list_type, in: %w(groups projects)
belongs_to :content
has_many :contents, :order => :position
end
Tengo este modelo en mi aplicación de rieles que arroja una advertencia cuando intento crear registros en la consola.
ADVERTENCIA DE DEPRESIÓN: Las siguientes opciones en su declaración RelatedList.has_many: contents están en desuso:: orden. Por favor, use un bloque de alcance en su lugar. Por ejemplo, lo siguiente: has_many: spam_comments, conditions: {spam: true}, class_name: ''Comment'' debe reescribirse como sigue: has_many: spam_comments, -> {where spam: true}, class_name: ''Comment''. (llamado desde /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)
Parece que Rails 4 tiene una sintaxis nueva: ordenar para usar en modelos, pero parece que no puedo encontrar la documentación en Rails Guides.
En Rails 4,: el :order
ha quedado obsoleto y debe ser reemplazado con un bloque de alcance lambda, como se muestra en la advertencia que ha publicado en la pregunta. Otro punto a tener en cuenta es que este bloque de ámbito se debe pasar antes que cualquier otra opción de asociación, como dependent: :destroy
etc.
Prueba esto:
has_many :contents, -> { order(:position) }
Para especificar la dirección del pedido, es decir, asc
o desc
como lo han sugerido @ joshua-coady y @wsprujit, use:
has_many :contents, -> { order ''position desc'' }
o, usando el estilo hash:
has_many :contents, -> { order(position: :desc) }
Más referencia en Active Record Scopes para has_many
.
Me tomó un tiempo encontrar la forma de hacer el pedido e incluirlo, finalmente encontré que encadenaste las declaraciones del alcance ,
has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"
Solo pensé que agregaría que si tienes cualquier opción de argumentos hash, ellos tienen que buscar el lambda, así:
has_many :things, -> { order :stuff }, dependent: :destroy
Me tomó un minuto darme cuenta de esto, espero que ayude a cualquier otra persona que tenga esta misma pregunta a tener el mismo problema.