2010-09-22 62 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 

这可怎么作用域?