2015-11-30 5 views
3

Мои модели: User, Group, и Membership. Пользователи могут иметь много групп через членство и наоборот. Я хочу, чтобы создать инструмент для администраторов веб-сайта, который производит большую таблицу со следующей спецификацией:Получите пользователей с атрибутом для каждой группы?

Каждая строка представляет собой user, Каждый столбец представляет собой group, В каждой ячейке таблицы есть логическое значение, указывающее ли user принадлежит к group.

Что было бы лучшим способом сделать это? Можно ли написать один SQL-запрос, который его достигает (т. Е. User.find_by_sql)? Если нет, то как иначе?

p.s. Мне действительно нужно немного больше, чем это (мне нужно два столбца на группу, первый из которых указывает на членство, а второй подсчет количества meeting s user присутствовал в этом group, но это включает в себя модель Meeting, поэтому я оставить на потом

+0

Модель «Пользователь» имеет много «Членство», а в модели «Членство» есть много «Групп» '. Это верно? Потому что я редактирую ответ на этот вопрос. –

+0

В первом абзаце вы сказали, что _user может иметь много групп, но позже вы говорите, что _user принадлежит группе_. Попробуйте очистить это. –

ответ

0

Это будет мой подход:.

  1. Написать функцию, которая возвращает, если пользователь принадлежит к группе передается параметром Получить все группы от пользователя в вашей user.rb модели.. вы можете добавить этот метод get_groups для извлечения всех групп от пользователя, а затем метода is_in(group). Смотрите ниже код:

    class User < ActiveRecord::Base 
        #validations, some other stuff  
        has_many :memberships 
    
        #this method stores all the group-ids of the user in an array 
        def get_groups 
    
        myGroups = [] 
    
        memberships.each do |membership| 
         membership.groups.each do |group| 
         myGroups << group.id 
         end 
        end 
    
        return myGroups 
    
        end 
    
        #this method receive a Group object and return true if the user belongs to that group 
        def is_in(group) 
        groups = get_groups 
        return groups.include?(group.id) 
        end 
    
  2. Затем в представлении или контроллер можно работать следующим образом:

    #the columns of the table 
    groups = Group.all 
    
    #iterating all users 
    User.all.each do |user| 
    
        #each user has to see if it belongs to each group in the groups table 
        groups.each do |group| 
    
        #the boolean value you display in a cell 
        value = user.is_in(group) 
    
        end 
    
    end 
    
1

Если предположить, что вы спрашиваете о методологии бэкэнд не визуализации данных аспект наиболее о том, что ХуанМ. сказал правильно. Одна вещь, которую я бы рекомендовал, - это не писать свой метод get_groups и просто настраивать отношения между пользователями в группах. Для этого поместить

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, through: :memberships 
end 

В модели пользователей и наоборот в вашей модели групп (предполагая, что членство в «BELONGS_TO» и другое). Затем у вас будет метод «.групп» для любого экземпляра пользователя и метод «.users» для любого экземпляра группы

+0

@gdiazc Любые шансы я мог бы получить лучший ответ на это? Хотелось бы иметь возможность прокомментировать хаха – SomeSchmo

Смежные вопросы