2014-06-18 15 views
5

Ransack pozwala mi budować warunki z atrybutem, predykatem i wartością. Nie udało mi się jednak znaleźć żadnej dokumentacji dotyczącej porównywania jednego atrybutu z drugim. Na przykład, w jaki sposób można utworzyć warunek:Porównywanie jednego atrybutu do innego z przeszukiwaczem

WHERE column_a < column_b 
+0

A więc chcesz mieć atrybuty column_a i column_b. Nie jak "Person.search ({id_eq: 1}, {name_object:: abcd}). Result.to_sql' – Sontya

Odpowiedz

2

Używam ransack przez jakiś czas, ale nie widzę żadnej możliwości, aby zrobić to, czego szukasz. To, czego potrzebujesz, to instrukcja "case -> when", która może być utworzona w Railsach lub jako SQL z ActiveRecord.

Ransack daje możliwość utworzenia niestandardowego polecenia SQL, definiując atrybut, predykat i wartość, co następnie przekłada się na OSTATECZNE oświadczenie, o którym już wspomniałeś. Nie widzę żadnej możliwości, by powiedzieć Ransackowi, żeby filtrował to, co chcesz. Jednakże:

Co można to stworzyć możliwości takiego:

scope :column_b_gt_columnb_a, -> { where('column_b > column_a') } 

A potem można budować swoje wyszukiwanie takiego:

Object({ column_b_gt_columnb_a: true }) 

Prawdopodobnie nie do końca to, czego szukaliśmy, ale myślę, to najlepsze, co dostaniesz ...

A jeśli chcesz zrobić to za pomocą Railsów, to możesz porównać wartości lub użyć instrukcji where gdzie użyłem powyższego.

Records.each do |i| 
case i.variable_a 
    when i.variable_b 
    # do something when it's the same 
    when i.variable_a > i.variable_b 
    # do something when it's greater 
    end 
end 

Dla przykładu SQL spojrzeć tutaj

How do I compare two columns for equality in SQL Server?

Nadzieja to pomaga trochę!

Powiązane problemy