范围内的实例方法

问题描述:

我不知道它是否可能?我需要在范围内使用实例方法。类似这样的:范围内的实例方法

scope :public, lambda{ where ({:public => true}) } 

和每个记录上的调用实例方法(complete?)来查看它是否完成。这里的公共范围应该返回所有公开并已完成的记录,并且记录的完成是由实例方法“完成的?”确定的。

有什么可能吗?

谢谢

+0

中包含完整的λ也许送?逻辑作为范围lambda的参数? – Zabba 2011-06-01 09:10:25

作用域是关于使用ARel生成查询逻辑。如果你不能代表完整的逻辑?方法在SQL中,然后你有点卡住

作用域 - 在轨3至少 - 意味着链接在一起的查询逻辑没有返回结果集。如果您需要设置做你的测试完成的结果,你需要做的是这样

class MyModel < ActiveRecord::Base 
    scope :public, lambda{ where ({:public => true}) } 

    def self.completed_public_records 
    MyModel.public.all.select { |r| r.completed? } 
    end 
end 

# elsewhere 
MyModel.completed_public_records 

,或者您需要

class MyModel < ActiveRecord::Base 
    scope :public, lambda{ where ({:public => true}) } 
    # some other scopes etc 


    def self.completed_filter(finder_obj) 
    unless finder_obj.is_a?(ActiveRecord::Relation) 
     raise ArgumentError, "An ActiveRecord::Relation object is required" 
    end 
    finder_obj.all.select { |r| r.completed? } 
    end 
end 

# elsewhere 
MyModel.completed_filter(MyModel.public.another_scope.some_other_scope) 
+0

我也在想第一种方法,但没有范围。这意味着使用称为public的类方法并查找所有公共记录,然后通过完成筛选?方法,但想看看是否有任何方法使用范围。另外,我不能代表完整的逻辑?方法在查询语言中,所以我想我需要使用类方法。 – bikashp 2011-06-01 12:30:05

我创建了一个rubygem几个这个确切的问题更多的灵活性几个月前,当我有同样的问题。

它允许您添加对查询的结果集起作用的方法,但会将方法抽象为另一个类,因此它不会与模型混淆。

检查出来:https://github.com/coryodaniel/collectively