Область застосування за замовчуванням Rails 4


74

У моїй програмі Rails є область за замовчуванням, яка виглядає так:

default_scope order: 'external_updated_at DESC'

Зараз я перейшов на Rails 4, і, звичайно, я отримую таке попередження про застарівання "Виклик #scope або #default_scope з хешем застарілий. Будь ласка, використовуйте лямбда, що містить область дії.". Я успішно перетворив свої інші області, але я не знаю, яким повинен бути синтаксис для default_scope. Це не працює:

default_scope, -> { order: 'external_updated_at' }

Пов’язане: чи слід взагалі уникати default_scope та які альтернативні підходи?
Джей

Відповіді:


152

Має бути лише:

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

default_scope приймає блок, лямбда необхідна для scope (), оскільки є 2 параметри, ім'я та блок:

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

Дякую за пояснення, Люк. Я отримав синтаксичну помилку, а потім змінив її на default_scope {order ('external_updated_at')}, і вона спрацювала. Чи можете ви відредагувати свою відповідь, будь ласка, щоб я міг її прийняти?
Джо Гетт,

6
Це не працювало для мене в 4.0.2 без стрілки. Моє робоче рішення булоdefault_scope -> { order_by(:created_at => :desc) }
genkilabs

1
За домовленістю, символи є кращими при посиланні на атрибути. default_scope { order(:external_updated_at) }
scarver2

3
До речі, правильна відповідь на запитання default_scope order('external_updated_at DESC')
@JoeGatt

Це не стосується замовлення, якщо у вас є результати, які мають різний регістр (верхній або нижній регістр) ... будь-які думки щодо замовлення через default_scope при примусовому зменшенні регістру?
Кіс Бріггс,

21

Це те, що мені вдалося:

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

3
У новому синтаксисі Ruby:default_scope { order(created_at: :desc) }
Jeehut


2

Це спрацювало у мене (просто для ілюстрації з де), тому що я прийшов до цієї теми через ту ж проблему.

default_scope { where(form: "WorkExperience") }

2

Ви також можете використовувати lambdaключове слово. Це корисно для багаторядкових блоків.

default_scope lambda {
  order(external_updated_at: :desc)
}

що еквівалентно

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

і

default_scope { order(external_updated_at: :desc) }

1

Це працює для мене в Rails 4

default_scope { order(external_updated_at: :desc) }


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