2017-09-18 1 views
0

RansackPostgresql DBで検索しています。ArelとRansackを使用する複数列のILIKE

2つの異なる列で「ILIKE」(テキスト列)を使用して検索する必要がある入力があります。正常に動作します

ransacker :number do 
    Arel.sql("invoice_number::text") 
end 

Purchase.ransack({number_cont: "123"}).result.to_sql 
# => "SELECT \"purchases\".* FROM \"purchases\" WHERE (invoice_number::text ILIKE '%123%')" 

は、しかし、私は同じ入力(そう、同じransacker)を使用して別の列で検索し、今したい

は、まず私はこのransackerを作成しました。

ransacker :number do |parent| 
    Arel::Nodes::InfixOperation.new('OR', parent.table["invoice_number::text"], parent.table["shipping_number::text"]) 
end 

返す:私はこれをやってみました

Purchase.ransack({number_cont: "123"}).result.to_sql 
# => "SELECT \"purchases\".* FROM \"purchases\" WHERE (\"purchases\".\"invoice_number::text\" OR \"purchases\".\"shipping_number::text\" ILIKE '%123%')" 

をあなたが見ることができるようになる、私は必要なものと大差はない:

"column1 :: text ILIKE '%123%' OR column2 :: text ILIKE '%123%'"

これをどのように達成できますか?

答えて

0

のために働くのmysqlで以下の操作を行いますが、あなたは、クエリのparam名で複数のフィールドを結合する場合には、掻き回す宝石と同じように見えますそれは動作します:

class Purchase < ApplicationRecord 
    ransacker :number do 
    Arel.sql("invoice_number::text") 
    end 

    ransacker :shipping do 
    Arel.sql("shipping_number::text") 
    end 
end 

puts Purchase.ransack(shipping_or_number_cont: '123').result.to_sql 
# => SELECT "purchases".* FROM "purchases" 
# WHERE (shipping_number::text LIKE '%123%' OR invoice_number::text LIKE '%123%') 

あなたはのparamの名前を微調整することができるしているのであれば、これは

ransackerブロックの中にそれをやろうとしているよりも簡単かもしれ
0

私はこれは、あなたが希望しているものを正確ではない私

ransacker :invoice_number_or_shipping_number, formatter: proc { |v| 
    Purchase.where("invoice_number LIKE ? OR shipping_number LIKE ?", "%#{v}%", "%#{v}%").map(&:id).empty? ? 
    "SELECT NULL FROM DUAL WHERE 0 " : Purchase.where("invoice_number LIKE ? OR shipping_number LIKE ?", "%#{v}%", "%#{v}%").map(&:id) 
    }, splat_param: true do |parent| 
    parent.table[:id] 
end 
関連する問題