我现在使用以下代码:
def self.search(query)
where("name like ?", "%#{query}%")
end
仅适用于名称,但基本上我需要它适用于所有事情(出生日期,姓氏,姓名和姓氏等)。您能否告诉我一些如何使这段代码更适合我的需求的想法?
谢谢。
答案 0 :(得分:0)
如果你正在使用MySQL,那么dusen
gem就会做你想要的。
答案 1 :(得分:0)
在您的模型中,添加:
def self.search(cols, query)
tbl = self.arel_table
fq = tbl[cols.shift].matches("%#{query}%")
q = cols.inject(fq) do |acc, col|
acc.or(tbl[col].matches("%#{query}%"))
end
where(q)
end
然后您就可以使用它:
User.search([:name, :surname], 'name')
这会产生很好的SQL,如:
SELECT "users".* FROM "users" WHERE (("users"."name" LIKE '%name%'
OR "users"."surname" LIKE '%name%'))
如果您需要更好地控制查询,我有时会在AR中添加以下便捷方法:
def self.arel_where(&block); where(yield self.arel_table); end
然后你可以这样做:
User.arel_where do |tbl|
name = '%name%'; surname = '%sur%'
tbl[:name].matches(name).and(tbl[:surname].matches(surname))
end