在where语句中使用模型方法

时间:2014-02-24 13:01:28

标签: ruby-on-rails activerecord

我在模型中有一个方法,它通过计算子项和执行各种魔法来返回一个数字。它工作但我需要在where方法中使用它:

Product.joins(:owner).where('owner.budget > 0')

owner.budget是所有者模型上的方法。反正有没有在上面使用它?

由于

2 个答案:

答案 0 :(得分:1)

如果此方法(owner.budget)执行复杂计算和/或不直接映射到数据库列,则不能在where子句中使用它。但是,你可以这样做:

Product.joins(:owner).to_a.select{|p| p.owner.budget > 0 }

请注意,这会将所有产品加载到内存中并在应用程序中对其进行过滤。

答案 1 :(得分:0)

不,如果owner.budget是所有者模型上的实例方法。您必须在所有者类中创建范围类方法

假设budgetowners表的一列,您可以在所有者模型中定义此类方法

  def self.with_budget
    where('budget > 0')
  end

然后就这样称呼

  Product.joins(:owner).with_budget