首先,我使用带有 Squeel 1.0.13 的 Rails v3.2.9,这就是我想要做的:
我想使用三种识别信息中的任何一种来搜索客户 - 姓名、出生日期 (dob) 和社会保险号 (sin)。结果集必须包含具有任何标识符的任何记录 - 条件的 OR。我以前在 Squeel 中做过这个,它看起来像:
scope :by_any, ->(sin, name, dob){ where{(client.sin == "#{sin}") | (client.name =~ "%#{name}%") | (client.dob == "#{dob}")} }
只要我提供所有标识符,它就可以正常工作。但是如果我只有一个名字呢?上述范围导致:
SELECT "clients".* FROM "clients" WHERE ((("clients"."sin" IS NULL OR "clients"."name" ILIKE '%John Doe%') OR "clients"."dob" IS NULL))
这包括 sin 为 null 的客户端集和 dob 为 null 的客户端集,以及请求的名称为“John Doe”的客户端集。
所以输入我尝试有条件地将子句添加到where
块中。起初,我尝试使用 nil? 方法:
def self.by_any (sin, name, dob)
where do
(clients.sin == "#{sin}" unless sin.nil?) |
(clients.name =~ "%#{name}" unless name.nil?) |
(clients.dob == "#{dob}" unless dob.nil?)
end
这导致:
SELECT "clients".* FROM "clients" WHERE ('t')
提出了许多其他问题,比如那个“t”是怎么回事,但这是一个切线。
没有为每个排列编写 where 子句,有没有办法可以有条件地添加子句?