2016-04-13 13 views
1

私のアプリケーションでは、first_name,middle_nameおよびlast_nameという3つの列を持つ顧客モデルがあります。複数の列が検索で結合されます

class Customer < ActiveRecord::Base 
    belongs_to :user 

    def self.search(search, user) 
    if search 
     .where('first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?', "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%") 
     .where(user: user) 
    else 
     where(user: user) 
    end 
    end 

end 

この検索機能に関する問題は、それが一度に3つの列のいずれかで検索を可能とすることである:私は、検索を実行し、モデル内のメソッドを持っています。

たとえば、お客様のfirst_nameは「foo」、middle_nameは「bar」、last_nameは「baz」です。 "foo"、 "bar"、または "baz"を検索すると結果が返されますが、 "foo bar"または "bar baz"では結果が返されません。 3つの列全体で検索できるようにするにはどうすればよいですか?

答えて

2

あなたは

更新のようなデータベースクエリであなたのfield秒CONCATことができます。

.where("concat_ws(' ' , first_name, middle_name, last_name) LIKE ?", "%#{search}%") 

あなたならばこれはfoofoo bar、またはfoo bar baz なくfoo baz

のために働く必要がありますfoo bazをサポートしたい場合は

.where("first_name LIKE ? OR middle_name LIKE ?"\ 
     " OR last_name LIKE ? OR concat_ws(' ' , first_name, middle_name, last_name) LIKE ?"\ 
     " OR concat_ws(' ' , first_name, last_name) LIKE ?", 
     "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%") 
+0

ように試みることができる私は悩み作業このコードを取得することだ。これは、特定のデータベースを必要としていますか?私はsqliteのを使用しています – James

+0

申し訳ありません;一重引用符を二重引用符に変更するのを忘れました – illusionist

1

.where( "first_name LIKE? OR middle_name LIKE? OR last_name LIKE? %#{search}%、 "%#{search}%"、 "%#{search}%"、 "%#{search}%"、 " %は#{検索}% ")

+0

このコードは質問に答えますが、 _why_および/または_how_に関する追加の文脈を提供しています。 質問は長期的に有意に改善します あなたの答えrを押して説明を追加します。 –

0

あなたがPGを使用する場合は、この

def self.search(query) 
    where(['phone ilike :query', 
     'LOWER(name) ilike :query', 
     'LOWER(email) ilike :query', 
     'LOWER(address) ilike :query'].join(' OR '), {query: "%#{query}%" }) 
end 
関連する問題