Застаріле попередження для Rails 4 має_мало з замовленням


105
class RelatedList < ActiveRecord::Base
  extend Enumerize

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

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

end

У мене в моїй програмі рейки є ця модель, яка видає попередження, коли я намагаюся створювати записи в консолі.

ПОПЕРЕДЖЕННЯ ПРЕДУПРЕЖДЕННЯ: Наступні параметри у пов’язаному списку. Будь ласка, використовуйте замість цього блок блоку. Наприклад, такі: has_many: спам_комменти, умови: {спам: правда}, ім'я класу: 'Коментар' слід переписати так: has_many: spam_comments, -> {де спам: true}, class_name: 'коментар'. (зателефоновано за адресою /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)

Схоже, у Rails 4 є новий: синтаксис замовлення для використання в моделях, але я не можу знайти документацію в Rails Guides.

Відповіді:


250

У 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 .


3
працює чудово! де я можу знайти таку інформацію в путівниках або документах? Я не можу його знайти. Дякую.
shankardevy


4
Що робити, якщо у вас є більше одного застарілого варіанту, скажімо, oderі include? Це: { order(:position), include(:track) }кидає помилку на коми.
kakubei

2
Для замовлення asc / desc використовуйте-> { order(name: :asc) }
wspruijt

1
Якщо з якоїсь причини ви просто хочете, щоб колекція була замовлена ​​кілька разів, ви також можете зробити це, list.contents.order('position desc')що може бути більш ефективним в цілому, а не як нав'язлива модель (у проголосованій відповіді список знає поле вмісту, тут контролер знає це )
Брудний Генрі

35

Мені знадобилося певний час, щоб зрозуміти, як зробити замовлення та включити, я врешті-решт виявив, що ти ланцюжок заяв про сферу застосування ,

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

2
Це було саме моє питання. Намагаючись розібратися, як замовити відносини has_many за батьківським атрибутом. Не зрозумів, що ти можеш включати, як це, а потім замовити. Дякую!
timothyashaw

27

Просто подумав, я додам, що якщо у вас є якісь параметри хеш-аргументів, вони повинні йти за лямбда, наприклад:

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

Знаходив у мене хвилину, щоб розібратися в цьому сам - сподіваюся, це допоможе тому, хто має інші проблеми, які мають цю проблему.


3
Це стосується також "наскрізних" асоціацій, які можуть існувати на об'єкті -has_many :items, -> { order 'name' }, through: :suppliers
майор-майор

0

Це працює для мене з Rails 4 та MongoDB

has_many :discounts, order: :min_amount.asc

-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, -> {}.


4
Не використовуйте область за замовчуванням. Якщо ви звикли це робити, ви можете додати в цей магічний метод більше логіки. Важко це перекрити в майбутньому.
Grzegorz Łuszczek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.