organization.users.select("tags.name, users.id").
distinct.joins(roles: [:tags]).merge(Role.active).merge(Tag.interest)
.group_by(&:name).map do |interest, users|
{interest => users.map{ |u| User.find(u.id) }}
end
如何仅使用活动记录查询来实现?我上面用ruby做的分组效率很低,因为它为每个用户再次查询数据库,但是完成了这项工作。
我也试图通过这样的主动记录查询来实现它:
organization.users.select("tags.name, users.id").
distinct.joins(roles: [:tags]).merge(Role.active).merge(Tag.interest).group("tags.name")
但它给了我
PG :: GroupingError:ERROR:column" users.id"必须出现在GROUP中 BY子句或用于聚合函数
答案 0 :(得分:1)
很抱歉,如果我误解了您的问题,但我认为直接使用您的Tag
模型会更简单。您只需在has_and_belongs_to_many :users
模型中使用tags
并使用外部联接来获取所有内容。如果你需要一个带有标签名称的哈希值,那么它应该不是什么大问题。
# user.rb
class User < ActiveRecord::Base
belongs_to :organization
has_and_belong_to_many :tags
end
# tag.rb
class Tag < ActiveRecord::Base
has_and_belongs_to_many :users
def self.with_users_from_organization(organization)
self.includes(:users).where(users: { organization_id: organization.id })
end
end