2012-03-22 43 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