Ruby on rails 在模型中访问rails帮助器方法

Ruby on rails 在模型中访问rails帮助器方法,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,在Rails 3中,我在从模型中访问助手方法时遇到问题 在我的ApplicationController中,我有一个名为current_account的助手方法,它返回与当前登录用户关联的帐户。我有一个项目模型,其中包含与该帐户关联的项目。我在项目模型中指定了“属于:帐户”,在帐户模型中指定了“有很多”。所有这些似乎都正常工作,我的项目都与正确的帐户相关联 然而,当我使用“Project.all”时,所有的项目记录都会像您所期望的那样被返回。我希望它能够自动过滤项目,以便只返回与指定帐户关联的项

在Rails 3中,我在从模型中访问助手方法时遇到问题

在我的ApplicationController中,我有一个名为current_account的助手方法,它返回与当前登录用户关联的帐户。我有一个项目模型,其中包含与该帐户关联的项目。我在项目模型中指定了“属于:帐户”,在帐户模型中指定了“有很多”。所有这些似乎都正常工作,我的项目都与正确的帐户相关联

然而,当我使用“Project.all”时,所有的项目记录都会像您所期望的那样被返回。我希望它能够自动过滤项目,以便只返回与指定帐户关联的项目,我希望这是默认行为

所以我试着使用“default_scope”。我模型中的线条看起来像这样

default_scope :order => :name, :conditions => ['account_id = ?', current_account.id]
这抛出了一个错误的说法

未定义的局部变量或方法#

如果我将对current_account.id的调用替换为整数id-例如

default_scope :order => :name, :conditions => ['account_id = ?', 1]
一切正常。如何使我的模型可以访问我的活期账户方法


非常感谢

您无法从模型访问会话。相反,将帐户作为参数传递给命名范围

#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,所以可能命名范围已经更改。

您无法从模型访问会话。相反,将帐户作为参数传递给命名范围

#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,所以可能命名范围已经改变。

+1为mark的答案。这在Rails 3中应该仍然有效

仅向您展示rails 3向作用域和新的查询api:

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

+马克的答案是1。这在Rails 3中应该仍然有效

仅向您展示rails 3向作用域和新的查询api:

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

您已经建立了关联,所以不能使用:

@projects = current_account.projects.all
…在你的控制器里


我还没有将语法调整为Rails 3样式,因为我自己还在学习它。

您已经设置了关联,所以您不能只使用:

@projects = current_account.projects.all
…在你的控制器里


我还没有将语法调整为Rails 3风格,因为我自己还在学习它。

关联设置足以处理控制器和视图级别的作用域。我认为问题在于范围,例如,模型中的发现

在控制器中:

@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
类资源清册:销毁
拥有多个:产品,:至=>:库存\u项目
终止
类产品库存商品id)。大小
终止
def总液位

#Inventory.where(:account_id=>???)关联设置足以处理控制器和视图级别上的作用域。我认为问题在于范围,例如,模型中的发现

在控制器中:

@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
类资源清册:销毁
拥有多个:产品,:至=>:库存\u项目
终止
类产品库存商品id)。大小
终止
def总液位

#Inventory.where(:account_id=>?????)Oooops-刚刚注意到,因此去掉了错误消息末尾的hashtag。这只是一个课堂参考,非常感谢大家对这些的反馈。我仍然没有找到我想要的东西,因为我一直想让它成为默认行为。然而,我确实学习了创建作用域的新rails 3语法,因此我接受了cowboycoded的答案。再次感谢,Adsooops-刚刚注意到,在错误消息的末尾去掉了hashtag。这只是一个课堂参考,非常感谢大家对这些的反馈。我仍然没有找到我想要的东西,因为我一直想让它成为默认行为。然而,我确实学习了创建作用域的新rails 3语法,因此我接受了cowboycoded的答案。再次感谢,现在已弃用名为_scope
的广告,请改用
scope。非常感谢。但有没有办法让这种违约行为发生?我希望这样,当我使用Project.all时,默认情况下,它会假定结果应限制为单个帐户。
named_scope
现在已被弃用,请改用
scope
。非常感谢。但有没有办法让这种违约行为发生?我希望这样,当我使用Project.all时,默认情况下,它假定结果应该限制在单个帐户内。非常感谢。但有没有办法让这种违约行为发生?我希望这样,当我使用Project.all时,默认情况下,它假定结果应该限制在单个帐户内。非常感谢。但有没有办法让这种违约行为发生?我希望这样,当我使用Project.all时,默认情况下,它假定结果应该限制在单个帐户中。