Вы можете сделать это, используя отношение Self-Referential в вашей модели Group
.Именно здесь записи в таблице могут указывать на другие записи в той же таблице.
По существу, parent_id
для основных групп будет NULL
, а подгруппам будет присвоено значение parent_id
дляID столбца родительской группы.
Модель группы:
has_many :users
has_many :sub_groups, class_name: "Group", foreign_key: :parent_id
has_many :sub_group_users, through: :sub_groups, source: :users
belongs_to :parent, class_name: 'Group', foreign_key: :parent_id, optional: true
# This is a scope to load the top level groups and eager-load their users, sub-groups, and the sub-groups' users too.
scope :top_level, -> { where(parent_id: nil).includes :users, sub_groups: :users}
Контроллер групп:
def show
@group = Group.find(params[:id])
@category = @group.parent
@users = @group.users
@sub_group = @group.sub_groups.first
unless @sub_group.nil?
@relatives = @group.sub_group_users
end
end
private
def cat_params
params.require(:group).permit(:name, :parent_id, :sub_group)
end
def main_group
@group = Group.parent_id.nil?
end
Inдобавьте в свою таблицу groups
этот столбец: t.integer "parent_id"
добавьте в свою таблицу users
этот столбец: t.integer "group_id"
Вам нужно будет добавить :group_id
в свой user_params
(в контроллере пользователя).
Модель пользователя: belongs_to :group
В ваших группах отображается вид:
<% if @category %>
<% @users.each do |user| %>
<% end %>
<% else %>
<% @relatives&.each do |user| %>
<% end %>
<% end %>