我写的原始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个的角色来获取房屋。
任何指针将不胜感激,谢谢!
答案 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?
并将!
放在语句的前面。
希望这会有所帮助!