代码之家  ›  专栏  ›  技术社区  ›  Daniel Ortin

如何以多对多关系存储大量数据?轨道5

  •  -1
  • Daniel Ortin  · 技术社区  · 8 年前

    大家好,我在rails 5中做一个管理系统,我正在进行许可部分,基本上我希望一个用户有多个组,多个组有多个用户,我知道这是一个has\u many through关系,我知道如何从控制台配对,但我只知道如何将一个用户和一个组进行配对,例如:

    user = User.create name: "Luis", email: "example@email.com"
    group = Group.create name: "Development", description: "Those that get screwed thanks to the design >:v"
    group2 = Group.create name: "Design", description: "The creatives"
    grupo3 = Group.create name: "Ventas", description: "The annoying bugs that only think about making money overnight"
    membership = Membership.create group: group, user: user
    

    控制器是基本的脚手架,没有任何附加,用户通过设备进行注册

    我希望管理员在创建组时管理其用户,反之亦然,在创建用户时管理其组。

    我不希望管理员一次标记一个组,但从视图中选择几个组(开发、设计、招聘),rails可以一次保存所有组。也不知道您在可能存在的不同组中多次注册了同一用户。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Pablo    8 年前

    这可能有很多语法错误,因为我还没有测试过,但您可以理解并纠正它。

    用户模型

    class User < ApplicationRecord
      has_many :memberships
      has_many :groups, through: :memberships
    end
    

    组模型

    class Group < ApplicationRecord
      has_many :memberships
      has_many :users, through: :memberships
    end
    

    成员资格模型

    class Membership < ApplicationRecord
      belongs_to :group
      belongs_to :user
    end
    

    用户控制器

    def edit
      @user = User.find_by(id: params[:id]) 
      @allGroups = Group.all                
      @groupsTheUserIsMember = @user.groups.pluck(:id)
    end
    
    def update
      @user = User.find_by(id: params[:id])
      @user.memberships.destroy_all
      #params includes the list of group_ids that will be associated to the user
      params[:group_ids].each do |group_id|
        membership=Membership.create(user_id: @user.id, group_id: group_id)
      end
    end
    

    组控制器

    def edit
      @group = Group.find_by(id: params[:id])
      @allUsers = User.all
      @usersTheGroupIncludes = @group.users.pluck(:id)
    end
    
    def update
      @group = Group.find_by(id: params[:id])
      @group.memberships.destroy_all
      #params includes the list of user_ids that will be associated to the group
      params[:user_ids].each do |user_id|
        membership=Membership.create(user_id: user_id, group_id: @group.id)
      end
    end
    

    视图/用户/编辑。html。雇员再培训局

    <%= simple_form_for(@user) do |f| %>
      <h2>Groups</h2>
      <p>Select the groups where the user is member</p>
      <table>
        <%= render 'groups/groups_header' %>
        <%= render partial: 'groups/groups', collection: @allGroups, as: :group, locals: { user_id: @user.id } %>
      </table>
      <%= f.submit "Update", class: "btn" %>
    <% end %>
    

    视图/组/编辑。html。雇员再培训局

    <%= simple_form_for(@group) do |f| %>
      <h2>Users</h2>
      <p>Select the users that belong to the group</p>
      <table>
        <%= render 'users/users_header' %>
        <%= render partial: 'users/users', collection: @allUsers, as: :user, locals: { group: @group.id } %>
      </table>
      <%= f.submit "Update", class: "btn" %>
    <% end %>
    

    视图/组/\u组。html。雇员再培训局

    <tr>
      <td>
        <!-- check box to include or remove the group -->
        <% if @usersTheGroupIncludes.include?(user_id) %>
          <%= check_box_tag 'user_ids[]', user_id, checked: true %>
        <% else %>
          <%= check_box_tag 'user_ids[]', user_id %>
        <% end %>
      </td>
      <td>Group: <%= group.name %></td>
    </tr>
    

    视图/用户/\u用户。html。雇员再培训局

    <tr>
      <td>
        <!-- check box to include or remove the user -->
        <% if @groupsTheUserIsMember.include?(group_id) %>
          <%= check_box_tag 'group_ids[]', group_id, checked: true %>
        <% else %>
          <%= check_box_tag 'group_ids[]', group_id %>
        <% end %>
      </td>
      <td>User: <%= user.name %></td>
    </tr>