Устаревшее предупреждение для Rails 4 has_many с заказом

class RelatedList < ActiveRecord::Base
  extend Enumerize

  enumerize :list_type, in: %w(groups projects)

  belongs_to :content
  has_many :contents, :order => :position

end

У меня есть эта модель в моем приложении rails, которая выдает предупреждение, когда я пытаюсь создать записи в консоли.

ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ. В RelatedList.has_many: объявление содержимого устарело:: order. Вместо этого используйте блок областей. Например, следующее: has_many: spam_comments, условия: {spam: true}, class_name: 'Comment' следует переписать следующим образом: has_many: spam_comments, → { где spam: true}, class_name: 'Comment'       , (вызывается из /Users/shivam/Code/auroville/avorg/app/models/related _list.rb:7)

Кажется, что Rails 4 имеет новый синтаксис порядка для использования в моделях, но я не могу найти документацию в Rails Guides.

Ответ 1

В Rails 4, :order устарел и должен быть заменен блоком области лямбда, как показано в предупреждении, которое вы отправили в вопросе. Еще один момент, который следует отметить, заключается в том, что этот блок области видимости должен быть передан перед любыми другими параметрами ассоциации, такими как dependent: :destroy и т.д.

Попробуйте:

has_many :contents, -> { order(:position) }

Чтобы указать направление заказа, то есть либо asc, либо desc, как предложили @joshua-coady и @wsprujit, используйте:

has_many :contents, -> { order 'position desc' }

или, используя стиль хэша:

has_many :contents, -> { order(position: :desc) }

Дальнейшая ссылка на Активные области записей для has_many.

Ответ 2

Мне потребовалось некоторое время, чтобы выяснить, как делать заказ и включать, я в конце концов обнаружил, что вы задаете параметры области,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"

Ответ 3

Просто подумал, что добавлю, что если у вас есть какие-либо аргументы хэш-опции, они должны идти после лямбда, например:

has_many :things, -> { order :stuff }, dependent: :destroy

Потратил меня на минутку, чтобы понять это сам - надеюсь, это помогает кому-то еще приходить к этому вопросу с той же проблемой.

Ответ 4

В качестве альтернативы вы можете поместить предложение order на модель, например:

has_many :options, order: 'name' # In class Answer

становится

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

PS: я получил ArgumentError: wrong number of arguments (1 for 0) при выполнении has_many :things, -> {}.