2014-09-22 51 views
0
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 

=> {足球:[用户1,用户2,用户3,...],...}

如何只使用活动记录查询实现呢?我使用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" must appear in the GROUP BY clause or be used in an aggregate function

+0

嗨,你能详细说明它是什么查询,你正在努力实现的,也什么[:标签],Role.active,Tag.interest – 2014-09-22 15:21:06

+0

我想通过兴趣标签分组用户。结果就像我用{“interest”指定的散列:[用户对象数组]}。 – Machiaweliczny 2014-09-22 15:24:44

回答

1

很抱歉,如果我误解了你的问题,但我认为,这将是这样更简单地直接使用Tag模型。您只需在tags模型中使用has_and_belongs_to_many :users,并使用外部联接来获取所有内容。如果在此之后你需要一个带有标签名称的散列,那么它不应该是一个大问题。

# 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