如何使用Rails进行搜索?

时间:2014-07-07 10:39:40

标签: ruby-on-rails ruby search ruby-on-rails-4 filter

我现在使用以下代码:

def self.search(query)
    where("name like ?", "%#{query}%") 
end

仅适用于名称,但基本上我需要它适用于所有事情(出生日期,姓氏,姓名和姓氏等)。您能否告诉我一些如何使这段代码更适合我的需求的想法?

谢谢。

2 个答案:

答案 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