范围内的实例方法
问题描述:
我不知道它是否可能?我需要在范围内使用实例方法。类似这样的:范围内的实例方法
scope :public, lambda{ where ({:public => true}) }
和每个记录上的调用实例方法(complete?)来查看它是否完成。这里的公共范围应该返回所有公开并已完成的记录,并且记录的完成是由实例方法“完成的?”确定的。
有什么可能吗?
谢谢
答
作用域是关于使用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几个这个确切的问题更多的灵活性几个月前,当我有同样的问题。
它允许您添加对查询的结果集起作用的方法,但会将方法抽象为另一个类,因此它不会与模型混淆。
中包含完整的λ也许送?逻辑作为范围lambda的参数? – Zabba 2011-06-01 09:10:25