2014-02-05 41 views
0

ActiveRecord模型,我試圖動態創建一個查詢具有多個或條件。即:動態查詢多個或條件

SELECT * from articles 
WHERE (name LIKE '%a%' OR desc LIKE '%a%' OR 
     name LIKE '%b%' OR desc LIKE '%b%' OR 
     name LIKE '%c%' OR desc LIKE '%c%') 

我覺得我用arel在正確的軌道上,但我不能工作,如何開始查詢。

class Article < ActiveRecord::Base 

    attr_accessor :title, :text 

    def self.search(terms) 

    terms = *terms 
    t = self.arel_table 

    query = terms.reduce(???) do |query, word| 
     search_term = "%#{word}%" 
     query.or(t[:title].matches(search_term).or(t[:text].matches(search_term)).expr).expr 
    end 

    where(query) 
    end 

end 

我最初想到這個主意來自this answer,但原來query是一個字符串顯然,這也不是我可以扔掉.or到。

我需要在reduce方法中替換???來完成這項工作,還是需要採取完全不同的路徑(如我所懷疑的)?

回答

1

這是我做過什麼來得到它的工作:

class Article < ActiveRecord::Base 

    attr_accessor :title, :text 

    def self.search(terms) 
    terms = *terms 
    t = self.arel_table 

    # generate array of conditions 
    query = terms.collect do |word| 
     search_term = "%#{word}%" 
     t[:title].matches(search_term).or(t[:text].matches(search_term)).expr 
    end 

    # combine conditions 
    query = query.reduce {|query, condition| query.or(condition).expr } 

    where(query) 
    end 

end