Устаревшее предупреждение для 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, -> {}
.