2010-09-22 63 views
1

輔助方法在Rails 3,我有一個問題,從模型訪問軌在模型

在我的ApplicationController我有一個名爲current_account一個輔助方法,該方法返回一個與當前登錄相關聯的賬戶中訪問一個輔助方法用戶。我有一個項目模型,其中包含與該帳戶相關聯的項目。我在我的項目模型中指定了「belongs_to:account」,在我的帳戶模型中指定了「has_many」。所有這些似乎工作正常,我的項目正在與正確的帳戶相關聯。

但是,當我使用'Project.all'時,所有的項目記錄都會按照您的預期返回。我希望它自動過濾項目,以便只有那些與指定的帳戶相關聯的返回,我希望這是默認行爲

所以我嘗試使用'default_scope'。在我的模型行看起來是這樣的

default_scope :order => :name, :conditions => ['account_id = ?', current_account.id] 

這將引發一個錯誤,說了#

如果我換調用current_account.id一個整數ID

未定義的局部變量或方法current_account - 例如:

default_scope :order => :name, :conditions => ['account_id = ?', 1] 

一切工作正常。如何讓我的current_account方法

非常感謝

+0

Oooops - 只是注意到,SO在錯誤消息的末尾刪除了標籤。它只是一個參考類tho – Addsy 2010-09-22 12:13:11

+0

非常感謝大家對這些反饋。仍然沒有完全找到我在做什麼,因爲我正在尋找這種默認行爲。然而,我確實學習了用於創建示波器的新的rails 3語法,因此我接受了cowboycoded的答案。再次感謝,Ads – Addsy 2010-09-25 22:33:43

回答

1

+1對於mark的回答。這還是應該在工作的Rails 3

只是顯示你的導軌和範圍,新的查詢API 3路:

scope :my_custom_find, lambda { |account| where(:account_id=>account.id).order(:name) } 
+0

非常感謝。但是有沒有一種方法可以實現這種默認行爲?我希望這樣,當我使用Project.all時,默認情況下它假定結果應該限制爲一個帳戶。 – Addsy 2010-09-23 09:20:47

4

訪問我的模型無法從模型訪問會話。而應將該帳戶作爲參數傳遞給命名範圍。

#controller 
Model.my_custom_find current_account 

#model.rb 

named_scope :my_custom_find, lambda { |account| { :order => :name, :conditions => ['account_id = ?', account.id]}} 

我還沒有使用rails 3,所以named_scopes已經改變了。

+1

'named_scope'現已棄用,請使用'scope'代替。 – jpemberthy 2010-09-22 13:24:46

+0

非常感謝。但是有沒有一種方法可以實現這種默認行爲?我希望這樣,當我使用Project.all時,默認情況下它假定結果應該限制爲一個帳戶。 – Addsy 2010-09-23 09:14:53

0

你已經得到了協會成立,所以不能你只需要使用:

@projects = current_account.projects.all 

...在你的控制器中?

我還沒有將語法調整爲Rails 3樣式,因爲我仍然自己學習它。

2

關聯設置足以處理控制器和視圖級別的範圍。我認爲問題的範圍,例如,在模型中找到。

在控制器:

@products = current_account.products.all 

精細的視圖作用域,但...

在模型:

class Inventory < ActiveRecord::Base 
    belongs_to :account # has fk account_id 
    has_many :inventory_items, :dependent => :destroy 
    has_many :products, :through => :inventory_items 
end 

class Product < ActiveRecord::Base 
    has_many :inventory_items 

    def level_in(inventory_id) 
    inventory_items.where(:inventory_id => inventory_id).size 
    end 

    def total_level 
    # Inventory.where(:account_id => ?????) <<<<<< ISSUE HERE!!!! 
    Inventory.sum { |inventory| level_in(inventory.id) } 
    end 
end 

這可怎麼作用域?