2014-07-07 50 views
0

我用下面的代碼現在:如何使用Rails進行搜索?

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

只爲名稱的作品,但基本上我需要它的一切(的出生,姓,名+姓等等日期)工作。您能否告訴我一些想法,我可以如何讓這段代碼更適合我的需求?

謝謝。

+0

退房https://github.com/activerecord-hackery/meta_search – Nithin

+0

這應該'在哪裏(「名字怎麼樣?或者LIKE姓?或dob LIKE?「,」%#{query}%「,」%#{query}%「,」%#{query}%「)' – Pavan

+0

我認爲'dob'這個不行,如果'dob''datetime '列類型 –

回答

0

如果您使用的是MySQL,那麼dusen gem會按照您的要求做。

+0

我不使用MySQL。 – Xeen

+0

我已經更新了MySQL的答案。 –

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