我有一个 Rails 范围声明,我想要 2 个 where 子句。(当我开始工作时,我会清理硬编码)。
这是在我的工单模型中:
scope :laborok, where("wostatus_id NOT IN (?)", [231, 230, 8466, 8467, 232] ) and where("maxsynch = (?)", "N" )
逻辑是如果工作订单状态(wostatus.id)不是一个值,并且 workorder.maxsynch 等于“N”
我有一个 Rails 范围声明,我想要 2 个 where 子句。(当我开始工作时,我会清理硬编码)。
这是在我的工单模型中:
scope :laborok, where("wostatus_id NOT IN (?)", [231, 230, 8466, 8467, 232] ) and where("maxsynch = (?)", "N" )
逻辑是如果工作订单状态(wostatus.id)不是一个值,并且 workorder.maxsynch 等于“N”
您可以链接 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")
为什么要上链?
class Workorder < ActiveRecord::Base
scope :laborok, lambda do |ids, maxsynch|
where("wostatus_id NOT IN (?) AND maxsynch = ?", ids, maxsynch)
end
end
放入字符串中的内容只是传递给您的数据库适配器,并替换参数的值。因此,最简单的形式是只使用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 查询接口方法可以以这种方式链接。