我有一些过滤器按照管理员要求按顺序放置以获取目标用户
e.g (Filter_1 OR Filter_2) AND (Filter_3 OR Filter_4)
应用程序有许多过滤器,这些过滤器会提取符合某些条件的用户。但是这些过滤器使用3-4个内连接表。
Filter_1 =获取具有平均感知分数> = 0的用户生成查询
1. select user_avg_table.* from
(select users.*, avg(perception_score) as avg from users
inner join notes
on notes.user_id = users.id group by user_id) as user_avg_table where avg >= 0
Filter_2 = User.where(" Date(created_at)= DATE(NOW())")
2. SELECT * FROM `users` WHERE (Date(auth_token_created_at) = DATE(NOW()))
Filter_3 = User.joins(:notes).where(注释:{category:" Experiences"})
3. SELECT * FROM users INNER JOIN notes ON notes.user_id = users.id WHERE notes.category = ‘Experiences'
Filter_4 = User.joins(:transactions).where(transactions:{product_id:2})
4. SELECT * FROM users INNER JOIN transactions ON transactions.user_id = users.id WHERE transactions.product_id = 3
现在我正在为4个变量中的每个过滤器获取一个用户,然后执行ruby' |'和'&'他们的方法。
例如。
users_1 = Filter_1.get_users
users_2 = Filter_2.get_users
users_3 = Filter_3.get_users
users_4 = Filter_4.get_users
target_users = (users_1 | users_2) & (users_3 | users_4)
它为我提供了一系列用户。
我可以使用有效的记录查询来实现这一目标吗?这可以给我一组活动记录而不是用户数组。是否可以组合所有过滤器的查询?什么是最好的方法?
答案 0 :(得分:2)
Rails 4对or
命令的支持非常小(source),但听起来Rails 5会更好地支持它。您可以使用this gem作为后端。
但是这会生成一个包含大量连接的非常复杂的查询。
可能更快地执行4个较小的查询(您已经完成的工作)。如果您需要将此结果放在活动记录集合中,则可以执行此操作
ids = Filter_1.get_users.select(:id)
ids += Filter_2.get_users.select(:id)
ids += Filter_3.get_users.select(:id)
ids += Filter_4.get_users.select(:id)
User.where(id: ids)
作为旁注,通常最好在模型上创建命名每个子集的范围。这样,您可以写Filter_1.get_users
而不是Users.with_perception_score
。