2017-09-18 11 views
0

RansackPostgresql DB를 사용하여 검색하고 있습니다.Arel 및 Ransack이있는 여러 열의 ILIKE

두 개의 다른 열에서 "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 %'또는 column2 :: text ILIKE '% 123 %'"

어떻게 할 수 있습니까?

답변

0

작동 MySQL의에서 다음을 수행합니다,하지만 당신은 쿼리 매개 변수 이름에 여러 필드를 결합하는 경우는 더듬다 보석과 같다 그것은 작동 :

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%') 

을 그래서 당신은 매개 변수 이름을 조정할 수 있다면, 이것은 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