Rails 2.3.x - как работает эта область ActiveRecord? - PullRequest
4 голосов
/ 22 января 2011

В проекте, над которым я работаю, есть named_scope, который выглядит следующим образом:

 # default product scope only lists available and non-deleted products
  ::Product.named_scope :active,      lambda { |*args|
    Product.not_deleted.available(args.first).scope(:find)
  }

Исходный named_scope имеет смысл. Запутанная часть здесь - как работает .scope (: find). Это явно вызывает другую именованную область (not_deleted) и затем применяет .scope (: find). Что / как здесь работает .scope (: find)?

Ответы [ 2 ]

5 голосов
/ 22 января 2011

Быстрый ответ

Product.not_deleted.available(args.first)

- это сама именованная область, сформированная путем объединения обеих именованных областей.

scope(:find) получает условия для именованной области (или комбинации областей), которые вы, в свою очередь, можете использовать для создания новой именованной области.

Итак, к примеру:

named_scope :active,      :conditions => 'active  = true' 
named_scope :not_deleted, :conditions => 'deleted = false'

тогда пишешь

named_scope :active_and_not_deleted, :conditions => 'active = true and deleted = false'

или вы могли бы написать

named_scope :active_and_not_deleted, lambda { self.active.not_deleted.scope(:find) }

что идентично. Я надеюсь, что это проясняет.

Обратите внимание, что это стало проще (чище) в рельсах 3, вы бы просто написали

scope :active_and_not_deleted, active.not_deleted
2 голосов
/ 22 января 2011

Scope - это метод в ActiveRecord :: Base, который возвращает текущую область видимости для переданного метода (что фактически будет использоваться для построения запроса, если бы вы выполняли его в данный момент).

# Retrieve the scope for the given method and optional key.
def scope(method, key = nil) #:nodoc:
  if current_scoped_methods && (scope = current_scoped_methods[method])
    key ? scope[key] : scope
  end
end

Итак, в вашем примере, лямбда возвращает область для вызова Product.find после объединения всех других именованных областей.

У меня есть named_scope:

named_scope :active, {:conditions => {:active => true}}

В выводе моей консоли Object.active.scope(:find) возвращает:

{:conditions => {:active => true}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...