Rails 4在模型上标记用户

时间:2016-01-30 18:51:13

标签: ruby-on-rails ruby-on-rails-4 tags

标记用户的最佳方法是什么?如果您有团队模型,并且在创建团队时,您想要添加成员,这个架构将如何运作?

我一直在考虑将行为视为可疑并将其用于用户,但不确定这是否是最好的方法?还有另外一个宝石可以做这样的事情吗?

2 个答案:

答案 0 :(得分:2)

听起来你正在寻找has many through关系。这将要求您有一个名为team_members的加入表,以记录哪些用户是每个团队的成员,具有user_idteam_id列。例如,您的团队模型将具有如下所示的关系:

has_many :users, through: :team_members

然后,这将在Team上定义用于添加,查询和删除用户的适当方法。

更多信息是here

答案 1 :(得分:0)

要添加到@tpbowden的答案,如果您只是想要"标记"用户,您可能希望使用has_and_belongs_to_many

# app/models/user.rb
class User < ActiveRecord::Base
   has_and_belongs_to_many :teams
end

# join table "teams_users" - team_id | user_id

# app/models/team.rb
class Team < ActiveRecord::Base
   has_and_belongs_to_many :users
end

这样您就可以使用singular_collection_ids方法,通过该方法,您可以定义哪个用户位于&#34;团队&#34;:

#app/controllers/teams_controller.rb
class TeamsController < ApplicationController
   def edit
     @team = Team.find params[:id]
   end

   def update
     @team = Team.find params[:id]
     @team.update team_params
   end

   private

   def team_params
     params.require(:team).permit(user_ids: [])
   end
end

#app/views/teams/edit.html.erb
<%= form_for @team do |f| %>
   <%= f.collection_select :user_ids, User.all, :id, :name %>
   <%= f.submit %>
<% end %>

这就像接近&#34;标记&#34;因为你没有任何额外的依赖关系。