我正在使用Ransack提供數據過濾器。使用ransack通過關聯對象過濾多個條件
主要用戶模式有下列關聯關係: user has_many trips, through registrations
基本的搜索條件,如user's name=xyz and trip's name=abc
工作正常。
但是我們的大多數條件都適用於否定,例如user's name=xyz and trip's name=abc and trip's name != def
未按預期工作。
我們正試圖找出曾經參加過ABC旅行的人,但不是在DEF旅行中。但爲上述查詢生成的SQL生成此子句:WHERE (trips.name LIKE 'ABC') AND (trips.name NOT LIKE 'DEF')
。這顯然不起作用,因爲用戶表與此子句是左內連接的,trip.id是針對名稱類似ABC的行生成的,並不像DEF。
如何使用Ransack做到這一點?
UPDATE:
如果搜索查詢,生成的SQL「誰擁有了名爲‘ABC’之旅用戶」是好的: SELECT DISTINCT users.* FROM users LEFT OUTER JOIN registrations ON registrations.user_id = users.id LEFT OUTER JOIN trips ON trips.id = registrations.batch_id WHERE (trips.name LIKE '%ABC%')
如果搜索查詢是「用戶誰擁有了在ABC'和'DEF'旅行中,一個人怎麼做?我嘗試了兩種不同的方法:
- 兩個單獨的條件,名稱='ABC'和名稱='DEF'。這是通過「全部匹配」完成的。 SQL在生成時給出了0個結果(顯然):
SELECT DISTINCT users.* FROM users LEFT OUTER JOIN registrations ON registrations.user_id = users.id LEFT OUTER JOIN trips ON trips.id = registrations.batch_id WHERE ((trips.name LIKE '%ABC%' AND trips.name LIKE '%DEF%'))
- 我試着「匹配任何」代替。這給了這個:
SELECT DISTINCT users.* FROM users LEFT OUTER JOIN registrations ON registrations.user_id = users.id LEFT OUTER JOIN trips ON trips.id = registrations.batch_id WHERE ((trips.name LIKE '%ABC%' OR trips.name LIKE '%DEF%'))
第二個查詢結果是誰已經在ABC或DEF的那些用戶。要添加到此,我們希望這個查詢:「已經在ABC上但不在DEF上的用戶」。我嘗試了兩種條件(全部匹配):trip.name = ABC和trips.name不像DEF。這是SQL生成的: SELECT DISTINCT users.* FROM users LEFT OUTER JOIN registrations ON registrations.user_id = users.id LEFT OUTER JOIN trips ON trips.id = registrations.batch_id WHERE ((trips.name LIKE '%ABC%' AND trips.name NOT LIKE '%DEF%'))
以上查詢返回了旅行ABC的人。它沒有過濾掉那些完成了DEF的人,因爲查詢顯然是錯誤的。
你好,可以請你在這裏分享整個搜索過濾條件,那麼我可以幫你更好的辦法。 –
我已經使用搜索過濾器更新了原始問題。 – sridharraman
是的,這個查詢首先檢查'ABC'的名字,然後檢查結果數據,旅行的名字不應該'DEF',所以我認爲這個查詢是正確的。 –