2012-03-22 69 views
3

我想弄清楚是否有一种方法可以重用AR调用中的范围。这是我的例子Rails 3 - 访问范围链以重用

@current_account.items.report_by_month(month, year) 

里面的report_my_month范围,我想重用@current_account

def self.report_by_month(month, year) 
    values = Values.where(:current_account => USE SCOPE FROM SELF) 
    scope = scoped{} 
    scope = scope.where(:values => values) 
end 

这只是示例代码,找出如何做到这一点,因为查询要复杂得多因为这是一个报告。谢谢!

+0

打电话请发表您的型号代码.. – 2012-03-22 03:06:45

+0

模型是巨大的,我试图访问current_account在self.report_by_month。不知道为什么模型的其他部分甚至会相关。试图看看我能否得到一个scope.current_account.subdomain或类似的东西 – bokor 2012-03-22 22:52:20

+1

我们不需要整个模型代码,但发布模型之间的关系将帮助您更快地得到答案。 – 2012-03-22 23:14:36

回答

3

是否有一个原因,你不能简单地将它作为附加参数传递?

def self.report_by_month(month, year, current_account) 
    values = Values.where(:current_account => current_account) 
    scope = scoped{} 
    scope = scope.where(:values => values) 
end 

一个名为

@current_account.items.report_by_month(month, year, @current_account) 

编辑:

如果你只是想避免再次通过@current_account,我建议在您的帐户类中添加一个实例方法此。

class Account 
    has_many :items 

    def items_reported_by_month(month, year) 
    self.items.report_by_month(month, year, id) 
    end 
end 

然后你可以用

@current_account.items_reported_by_month(month, year) 
+0

这就是所期望的效果 - 我很想知道范围已被调用的上下文是否隐含可用。如果可能的话,我想避免像'current_user.invoices.overdue_for(current_user)'这样的操作。 – nfm 2012-08-12 06:15:55

+1

简短的回答是,该方法的范围是在类上,所以你的范围是类本身而不是类的实例。 – engineerDave 2012-08-14 14:56:15

+1

作用域本质上是修改ActiveRecord :: Relation的单个实例的类方法。每次你调用一个方法时,你不会创建一个新的实例,所以没有链条上去。我已经用避免'current_user.invoices.overdue_for(current_user)'类型调用的解决方案更新了我的答案。 – sgrif 2012-08-14 19:04:15