2014-09-22 3 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 

=> {Футбол: [User1, User2, Пользователь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 –

+0

Я хочу, чтобы пользователи, сгруппированных по процентным тегах. Результат подобен указанному хешу с {"interest": [массив пользовательских объектов]}. – Machiaweliczny

ответ

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 
Смежные вопросы