Rails 4 область действия по умолчанию

В моем приложении Rails есть область по умолчанию, которая выглядит так:

default_scope order: 'external_updated_at DESC'

Сейчас я обновился до Rails 4 и, конечно же, получаю следующее предупреждение об устаревании: "Вызов #scope или #default_scope с хэшем не рекомендуется. Пожалуйста, используйте лямбду, содержащую область действия". Я успешно преобразовал другие области, но не знаю, какой должен быть синтаксис для default_scope. Это не работает:

default_scope, -> { order: 'external_updated_at' }

8 ответов

Решение

Должно быть только:

class Ticket < ActiveRecord::Base
  default_scope { order(:external_updated_at) } 
end

default_scope принимает блок, лямбда необходима для scope(), потому что есть 2 параметра, name и block:

class Shirt < ActiveRecord::Base
  scope :red, -> { where(color: 'red') }
end

Вот что сработало для меня:

default_scope  { order(:created_at => :desc) }

Это также сработало для меня:

default_scope { order('created_at DESC') }

Вы также можете использовать lambda ключевое слово. Это полезно для многострочных блоков.

default_scope lambda {
  order(external_updated_at: :desc)
}

что эквивалентно

default_scope -> { order(external_updated_at: :desc) }

а также

default_scope { order(external_updated_at: :desc) }

Это сработало у меня (только для иллюстрации с помощью where), потому что я пришел к этой теме по той же проблеме.

default_scope { where(form: "WorkExperience") }

Это работает для меня в Rails 4

default_scope { order(external_updated_at: :desc) }
default_scope { 
      where(published: true) 
}

Попробуй это.

default_scope -> { order(created_at: :desc) }

Не забывайте -> условное обозначение

Другие вопросы по тегам