重用named_scope来定义另一个named_scope

mxg*_*grn 8 activerecord named-scope ruby-on-rails searchlogic

我看到问题的本质

有一天,如果我没弄错的话,我已经看到了重用named_scope来定义另一个named_scope的例子.像这样的东西(不记得确切的语法,但这正是我的问题):

named_scope :billable, :conditions => ...
named_scope :billable_by_tom, :conditions => {
    :billable => true, 
    :user => User.find_by_name('Tom')
}
Run Code Online (Sandbox Code Playgroud)

问题是:如果可能的话,确切的语法是什么?我找不到它,谷歌也没有帮助.

一些解释

为什么我真的想要它,是因为我使用Searchlogic来定义一个复杂的搜索,这可能会产生如下表达式:

Card.user_group_managers_salary_greater_than(100)
Run Code Online (Sandbox Code Playgroud)

但到处都是太长了.因为据我所知,Searchlogic只是动态定义了named_scopes,我想在Card类上设置一个named_scope,如下所示:

named_scope from_big_guys, { user_group_managers_salary_greater_than(100) }
Run Code Online (Sandbox Code Playgroud)

- 这是我在named_scope中使用那个漫长的Searchlogic方法的地方.但是,再次,语法是什么?无法弄清楚.

恢复

那么,named_scope嵌套(我不是指链接)实际上可能吗?

Oin*_*nak 8

您可以使用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
Run Code Online (Sandbox Code Playgroud)

这样它就可以与其他named_scopes链接.

我在我的代码中使用它,它完美地工作.

我希望它有所帮助.


Har*_*tty 2

请参阅前段时间在 SO 提出的这个问题。lighthouse有一个补丁可以满足您的要求。