活动记录分组

时间:2014-09-22 15:14:34

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

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

=> {Football:[User1,User2,User3,...],..}

如何仅使用活动记录查询来实现?我上面用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子句或用于聚合函数

1 个答案:

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