在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
如果我将调用交换到current_account.id获取整数id - 例如
default_scope :order => :name, :conditions => ['account_id = ?', 1]
一切正常。如何使我的模型可以访问current_account方法
非常感谢
答案 0 :(得分: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 :(得分: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
这怎么可以作为范围?
答案 2 :(得分:1)
+1标记答案。这应该仍然适用于Rails 3。
只需使用范围和新查询api向您展示rails 3:
scope :my_custom_find, lambda { |account| where(:account_id=>account.id).order(:name) }
答案 3 :(得分:0)
你已经建立了关联,所以你不能只使用:
@projects = current_account.projects.all
...在您的控制器中?
我没有将语法调整为Rails 3样式,因为我自己还在学习它。