Каково значение именованной области в Rails? - PullRequest
2 голосов
/ 27 мая 2010

Прежде чем перейти к деталям.

Вопрос 1: - Что означает здесь область действия (то есть с именем ** scope )? **

В чем преимущества использования именованной области?

Теперь: -

из книги Agile Development с Rails: -

class Order < ActiveRecord::Base
   named_scope :last_n_days, lambda { |days| {:conditions =>
  ['updated < ?' , days] } }

 named_scope :checks, :conditions => {:pay_type => :check}
end

Такой именованный объем позволил бы найти количество заказов на прошлой неделе оснастки.

   orders = Orders.last_n_days(7)

Области также могут быть объединены

orders = Orders.checks.last_n_days(7)

почему мы используем named_scope здесь. Мы можем сделать то же самое, используя методы. Что особенного мы получили, используя named_scope.

Ответы [ 3 ]

3 голосов
/ 27 мая 2010

мы получаем более короткий, цепной и более читаемый код:

orders = Orders.checks.last_n_days(7)

гораздо более читабелен, короче и не цепочки, чем

orders = Orders.all :conditions => ["updated < ? and pay_type='check'", 7]

В Rails3 преимущество будет еще больше из-за arel . Для получения дополнительной информации я рекомендую смотреть Railscasts:

  1. 108 named_scope (некоторые основы в рельсах 2)
  2. 202 Запросы активной записи в Rails 3 (некоторые основы в rails 3)
  3. 215 Расширенные запросы в Rails 3 (некоторые расширенные темы в Rails 3)
2 голосов
/ 27 мая 2010

Область просто означает некоторый выбранный диапазон. Так что если вы используете:

orders = Orders.checks.last_n_days(7)

тогда вы хотите выбрать из заказов только те заказы, которые оплачены чеком и находятся в течение последних 7 дней. Таким образом, вы "объем" заказов.

Почему бы не использовать методы?

Именованные области - это методы. Это просто более простой способ их определения, поэтому вам не нужно заботиться обо всех деталях, и вы можете быть счастливы, используя его!

И помните, что области просто добавляют некоторые условия (и другие вещи) в SQL-запрос.

2 голосов
/ 27 мая 2010

named_scope действительно полезен для 2 случаев

лучше для чтения

С хорошим named_scope вы сможете легче понять, что вы действительно ищете.

1010 * Chaining *

Все named_scope могут быть связаны. Так что если вы хотите создать поисковую систему, это легко сделать. Сделано до того, как стало больно.

Вы можете создать цепочку на лету.

...