如何基于联接表过滤关系?

时间:2019-08-20 02:42:32

标签: sql ruby-on-rails ruby postgresql activerecord

我写的原始SQL并不多,所以我事先表示歉意。我大部分必要的查询都在框架的方法和活动记录中解决。希望我能很好地解释我的问题:我有3个模型:

class Home < ApplicationRecord

has_and_belongs_to_many :users
# has an attribute "max_number" with the maximum number of users allowed to belong.
class User < ApplicationRecord

has_and_belongs_to_many :homes
has_many :roles, as: :roleable

class Role < ApplicationRecord

belongs_to :roleable, polymorphic: true
# has an attribute "name" with the name of the role

我想获取所有具有任何角色名称(“所有者”除外)且最多关联2个用户的用户。我已经尝试了许多与此查询类似的事情:

Home.joins(user: :roles).group('user.id').having('COUNT(CASE WHEN roles.name != "owner" THEN 1 END) > max_number')

但这不会产生预期的结果。这似乎包括已经拥有2个用户的记录,并且似乎不受roles.name部分的影响。

我的措辞可能令人困惑:我本质上需要能够计算没有用户“所有者”名称的角色数量,并基于少于2个的角色来获取房屋。

任何指针将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

如果不必严格基于SQL的解决方案,则可以始终使用Ruby和Rails来查找这些房屋。

您可以在select集合上使用Home.all方法来返回所有通过块中提供的条件的元素。就是这样:

Home.all.select { |h| h.users.map(&:role).exclude?('owner') && h.users.count < 3 }

请注意,exclude?是Rails方法,如果您想使用基于Ruby的解决方案,则可以随时联系include?并将!放在语句的前面。

希望这会有所帮助!