Многократное использование named_scope для определения другого named_scope

Проблемная сущность, поскольку я вижу его

Однажды, если я не ошибаюсь, я видел пример многократного использования named_scope для определения другого named_scope. Что-то вроде этого (не может помнить точный синтаксис, но это - точно мой вопрос):

named_scope :billable, :conditions => ...
named_scope :billable_by_tom, :conditions => {
    :billable => true, 
    :user => User.find_by_name('Tom')
}

Вопрос: каков точный синтаксис, если это возможно вообще? Я не могу найти его назад, и Google не имел справки также.

Некоторые объяснения

То, почему я на самом деле хочу это, то, что я использую Searchlogic для определения сложного поиска, который может привести к выражению как это:

Card.user_group_managers_salary_greater_than(100)

Но это слишком длинно, чтобы быть помещенным везде. Поскольку, насколько я знаю, Searchlogic просто определяет named_scopes на лету, я хотел бы установить named_scope на классе Карты как это:

named_scope from_big_guys, { user_group_managers_salary_greater_than(100) }

- это - то, где я использовал бы тот длинный метод Searchlogic в своем named_scope. Но, снова, каков был бы синтаксис? Не может понять это.

Резюме

Так, действительно ли named_scope является вложением (и я не означаю объединять в цепочку), на самом деле возможный?

8
задан mxgrn 14 March 2010 в 20:31
поделиться

3 ответа

Обратитесь к этому вопросу , поднятому некоторое время назад здесь, в SO. На маяке есть заплатка для выполнения ваших требований.

2
ответ дан 5 December 2019 в 12:57
поделиться

Вы можете использовать метод для объединения некоторых named_scope, например :


def self.from_big_guys
  self.class.user_group_managers_salary_greater_than(100)
end

Эта возможность добавлена в Rails 3 с новым синтаксисом (http://m.onkey.org/2010/1/22/active-record-query-interface)

0
ответ дан 5 December 2019 в 12:57
поделиться

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

class Thing
  #...
  named_scope :billable_by, lambda{|user| {:conditions => {:billable_id => user.id } } }
  named_scope :billable_by_tom, lambda{ self.billable_by(User.find_by_name('Tom').id).proxy_options }
  #...
end

Таким образом, ее можно связать с другими named_scopes.

Я использую это в своем коде, и он отлично работает.

Надеюсь, это поможет.

8
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: