我正在使用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')
。这显然是行不通的,因为users表是与该子句左内连接的,并且trip.ids是为名称如ABC而不是DEF的行生成的。
如何使用Ransack做到这一点?
更新:
如果搜索查询为“名为'ABC'的出行用户”,则生成的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%')
如果搜索查询为“出行'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的人员,因为查询显然是错误的。
最佳答案
曾旅行“ ABC”但未旅行“ DEF”的用户:User.ransack(trips_name_eq: 'ABC', trips_name_not_eq: 'DEF').results
关于mysql - 使用Rasack通过关联对象过滤多个条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22629855/