你能在ARel查询中调用实例方法吗? (导轨)

时间:2016-02-17 07:37:53

标签: ruby-on-rails activerecord

我想在数据库查询中使用实例方法(?)。如果我的班级中有一个实例方法,检查字段是否为非零

class Foo < ActiveRecord::Base

   def is_completed?
      return !!(field_1 && field_2 && field_3)
   end
end

我可以在AR查询中以某种方式使用它吗?我想做像

这样的事情
Foo.where(is_completed?: true)

我能想到的另一个选择是在模型中保留一个单独的列is_completed并根据is_completed?进行更新,但这似乎相当迂回。

2 个答案:

答案 0 :(得分:2)

您可以使用范围:

class Foo < ActiveRecord::Base
  scope :is_completed?, lambda { where.not(field1: [nil, ""], field2: [nil, ""], field3: [nil, ""])  }
end

对于整数/浮点数/非字符串类型,只检查nil(而不是""),否则您将得到一个空的关系。

然后你可以像这样使用它。

 Foo.is_completed?

答案 1 :(得分:0)

使用范围进行这类查询,检查非空字段。

scope :is_completed?, ->{ where.not("field1 is null and field2 is null and field3 is null") }

使用,

Foo.is_completed?