可以使用rails中的AND OR条件进行复杂的活动记录查询

时间:2016-05-02 19:24:42

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一些过滤器按照管理员要求按顺序放置以获取目标用户

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)

它为我提供了一系列用户。

我可以使用有效的记录查询来实现这一目标吗?这可以给我一组活动记录而不是用户数组。是否可以组合所有过滤器的查询?什么是最好的方法?

1 个答案:

答案 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