[英]Accessing rails helper methods in models
在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方法
非常感谢
您无法从模型访问会话。 而是将帐户作为参数传递给命名范围。
#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可能已更改。
关联设置足以应付控制器和视图级别的作用域。 我认为问题在于范围,例如,在模型中查找。
在控制器中:
@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
如何确定范围?
+1为马克的答案。 在Rails 3中仍然可以使用。
仅向您展示使用范围和新查询API的Rails 3方式:
scope :my_custom_find, lambda { |account| where(:account_id=>account.id).order(:name) }
您已经建立了关联,所以您不能只使用:
@projects = current_account.projects.all
...在您的控制器中?
我尚未将语法调整为Rails 3风格,因为我仍在自己学习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.