モデルに以下を書いて
scope :search, proc { |q| where(LexicalSearch::ArelBuilder.new(self, q).run) }
検索
AR.search("a") # => #<ActiveRecord::Relation [#<User id: 1, name: "alice">]>
構文 | 意味 | 備考 | SQL |
---|---|---|---|
a | a を含む | 文字列カラムが対象 | |
-a | a を含まない | ||
‘a b’ | ‘a b’ を含む | “aa bb” にマッチ | |
a b | a と b を含む | a AND b と同等 | |
a or b | a または b を含む | ||
( ) | 優先度の確定 | 普通の式と同じ | |
x==1 | x カラムが 1 | x = 1 | |
x!=1 | x カラムが 1 ではない | x != 1 AND x IS NOT NULL | |
x=@y | x カラムに y を含む | x LIKE ‘%y%’ | |
x!@y | x カラムに y を含まない | x NOT LIKE ‘%y%’ AND x IS NOT NULL | |
x>=1 | x カラムが 1 以上 | x >= 1 | |
x<=1 | x カラムが 1 以下 | x <= 1 | |
x<1 | x カラムが 1 未満 | x < 1 | |
x>1 | x カラムが 1 より大きい | x > 1 |
構文・演算子 | 意味 | 備考 |
---|---|---|
blank:x | x カラムが空 | 空は NULL または空文字列 |
present:x | x カラムが空ではない |
クエリ | 意味 |
---|---|
(a OR b) (c OR d) | aまたはb かつ cまたはd を含む |
a b OR c d | aとb または cとd を含む |
(a b) OR (c d) | aとb または cとd を含む |
a (b OR c) d | a b c を含む または a c d を含む |
a (b OR c) d -e | a b c を含む または a c d を含む が e は含まない |
-(a OR B) のような書き方はできないので (-a AND -b) のように書換える
rescue_from LexicalSearch::SyntaxError do |exception| flash.now[:error] = I18n.t("lexical_search.syntax_error") render :nothing => true, :layout => true end
- q=<word> で単語検索対応
- joinが入ったときの例も追加
- 文字ではなく文字の種類も持つべき?
- require “active_support/all” の時点で node.rb や builder.rb が読み込まれるためファイル名を変更している。
- 1.9系だとそうならない。1.9に移行したら arel_builder.rb → builder.rb に変更する。