through rails many how has_and_belongs_to_many has foreign example create belongs and active ruby-on-rails ruby-on-rails-4

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.