代码之家  ›  专栏  ›  技术社区  ›  Addsy

访问模型中的Rails帮助程序方法

  •  1
  • Addsy  · 技术社区  · 15 年前

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

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

    然而,当我使用“project.all”时,所有的项目记录都将按您的预期返回。我希望它自动筛选项目,以便只返回与指定帐户关联的项目,我希望这是默认行为

    所以我尝试使用“默认的”范围。我模型里的线条看起来像这样

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

    这会引发一个错误,说

    未定义的局部变量或方法 current_account 对于γ

    如果我将调用调到current_account.id换成整数id-eg

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

    一切正常。如何使我的模型可以访问我的当前帐户方法

    非常感谢

    4 回复  |  直到 15 年前
        1
  •  1
  •   johnmcaliley    15 年前

    +1代表马克的回答。这在Rails 3中仍然有效。

    只需向您展示带有作用域和新查询API的Rails 3种方式:

    scope :my_custom_find, lambda { |account| where(:account_id=>account.id).order(:name) }
    
        2
  •  4
  •   mark    15 年前

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

    #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,所以可能命名为“作用域”已更改。

        3
  •  2
  •   Liquiddots    15 年前

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

    在控制器中:

    @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
    

    如何确定范围?

        4
  •  0
  •   Steve Hill    15 年前

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

    @projects = current_account.projects.all
    

    …在你的控制器里?

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