1

我有一个 Rails 范围声明,我想要 2 个 where 子句。(当我开始工作时,我会清理硬编码)。

这是在我的工单模型中:

  scope :laborok, where("wostatus_id NOT IN (?)", [231, 230, 8466, 8467, 232] ) and where("maxsynch = (?)", "N" )

逻辑是如果工作订单状态(wostatus.id)不是一个值,并且 workorder.maxsynch 等于“N”

4

3 回答 3

4

您可以链接 where() 方法:

scope :laborok, where("wostatus_id NOT IN (?)", [1]).where("maxsynch = (?)", "N")

[1]什么,我用!替换了你的 ID 数组。这是带有您的 ID 数组的代码:

scope :laborok, where("wostatus_id NOT IN (?)", [231, 230, 8466, 8467, 232]).
                  where("maxsynch = (?)", "N")
于 2013-05-01T16:52:20.730 回答
1

为什么要上链?

class Workorder < ActiveRecord::Base
    scope :laborok, lambda do |ids, maxsynch| 
        where("wostatus_id NOT IN (?) AND maxsynch = ?", ids, maxsynch)
    end
end
于 2013-05-01T17:00:20.607 回答
0

放入字符串中的内容只是传递给您的数据库适配器,并替换参数的值。因此,最简单的形式是只使用AND关键字:

scope :laborok, where(["wostatus_id NOT IN (?) AND maxsynch = (?)", [231, 230, 8466, 8467, 232], "N"] )

字符串中有多个?where第一个参数是传递给数据库适配器的字符串,而后续参数按提供的顺序替换到字符串中。

如果在您的特定情况下更具可读性,则链接也可以正常工作:

scope :laborok, where("wostatus_id NOT IN (?)", [231, 230, 8466, 8467, 232]).
                where("maxsynch = (?)", "N")

许多ActiveRecord 查询接口方法可以以这种方式链接。

于 2013-05-01T17:00:18.677 回答