2014-03-25 39 views
0

我正在使用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'旅行中,一個人怎麼做?我嘗試了兩種不同的方法:

  1. 兩個單獨的條件,名稱='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%'))
  2. 我試着「匹配任何」代替。這給了這個: 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的人,因爲查詢顯然是錯誤的。

+0

你好,可以請你在這裏分享整個搜索過濾條件,那麼我可以幫你更好的辦法。 –

+0

我已經使用搜索過濾器更新了原始問題。 – sridharraman

+0

是的,這個查詢首先檢查'ABC'的名字,然後檢查結果數據,旅行的名字不應該'DEF',所以我認爲這個查詢是正確的。 –

回答

0

用戶誰一直在旅途「ABC」,但不是「DEF」:

User.ransack(trips_name_eq: 'ABC', trips_name_not_eq: 'DEF').results