mroongaで論理積・論理和の検索条件を扱う - Bye Bye Mooreではmroonga_commandを使う方法を採用しました。
今回はMySQLの全文検索方式に倣ってBoolean modeによる論理積を実装してみます。
当該modelの末尾あたりに
scope :search_with, ->(name) { where(%Q(match(name) against("#{name.split(' ').map {|a| %Q(+#{a}) }.join(' ')}" in boolean mode))) }
と追加するだけです。
これをrails cで確認すると...
>> Professor.search_with 'alpha beta' Professor Load (16.6ms) SELECT `professors`.* FROM `professors` WHERE (match(name) against("+alpha +beta" in boolean mode)) => #<ActiveRecord::Relation [#<Professor id: 254, name: "beta alpha", ... , updated_at: "2014-05-19 05:23:59">]>
のように半角スペースで区切ったフレーズをAND検索しています。
注意
このままだと全角スペースを区切り文字と認識しない等々、
若干ユーザーアンフレンドリーな部分があります。
必要に応じてsedして下さい。