将连接查询与正常条件组合在一起

时间:2015-06-25 21:58:25

标签: ruby-on-rails

用户拥有主要类别和多个子类别

我希望获得属于某个类别的所有用户,无论他们是主要用户还是子用户。

@users = User.joins(:sub_categories).where('sub_category_id = ? OR type = ?', @sub_category.id, "User::#{category}User").page(params[:page])

用户的主要类别也是他们的STI类型。

查询有效,但是在尝试包含用户的主要类型时,我得到重复的结果。

生成的查询是:

User Load (0.0ms)  SELECT  "users".* FROM "users" INNER JOIN "user_sub_categories_users" ON "user_sub_categories_users"."user_id" = "users"."id" INNER JOIN "user_sub_categories" ON "user_sub_categories"."id" = "user_sub_categories_users"."sub_category_id" WHERE "users"."deleted_at" IS NULL AND (sub_category_id = 1 OR type = 'User::ModelUser')  ORDER BY "users"."created_at" DESC LIMIT 20 OFFSET 0
编辑:如果用户的主要用户不能属于子类别,那么将两个条件简单地加在一起是安全的

1 个答案:

答案 0 :(得分:2)

由于每个用户都有多个组,因此您的联接会为每个用户创建多个行,例如:

User    Group
-------|------
UserA  |GroupA
UserA  |GroupB
UserB  |GroupA
UserC  |GroupA
UserC  |GroupB

三个用户,但五行!

如果您只对不同的用户感兴趣,可以在查询末尾安全地添加.uniq。在ActiveRecord查询的上下文中,.uniq将转换为SQL DISTINCT()