Rails - 如何限制特定模型中特定用户的记录数

Rails - How to limit number of records for a particular user in a particular model

我设计了一个 Project 模型和 Team 模型以及 User 模型。模型之间的关联如下:-

class Project
  has_many :teams, :dependent => :destroy
end

class Team
    belongs_to :project
    belongs_to :user
end

class User
   has_many :teams, :dependent => :destroy
end

团队嵌套在项目中,因此每个项目都有自己独立的团队组。

resources :projects do
    resources :teams
  end

团队本身派生自用户,因此当创建新团队时,它会链接到已登录的 current_user:

  def create
    @project = Project.find(params[:project_id])
    @team = @project.teams.new(team_params)
    @team.user = current_user
   if @team.save
      redirect_to @project, notice: 'Successfully Joined Project'
    else
      render action: 'new'
    end
  end

问题:-

我需要用户每个项目只能有一个团队(这样他只能加入一个项目一次)。我想我可以通过以下方式做到这一点:

<% if @project.teams.user == current_user do %>
    <%= link_to 'edit role', edit_project_team_path(@project), class: 'btn btn-primary' %>
<% end %>
<% else %>
    <%= link_to 'Join Project', new_project_team_path(@project), class: 'btn btn-primary' %>
<% end %>

但是我在之前的代码中收到以下错误:

NoMethodError in Projects#show

undefined method `user' for #<Team::ActiveRecord_Associations_CollectionProxy:0x5858430>

我不确定问题出在我的联想上,还是我试图以错误的方式实现这一目标。

P.S 将团队视为团队成员(团队建议一组用户,但每个团队实际上只包含一个用户)

您正在尝试从关联对象中查找 user@project.teams.user 这里 @project.teams 将 return 多个对象而不是单个对象。因此,您应该将 @project.teams.user 更改为 @project.teams.first.user 。你不会得到这个错误。

<% if @project.teams.present? && @project.teams.first.user == current_user %>
    <%= link_to 'edit role', edit_project_team_path(@project), class: 'btn btn-primary' %>
<% else %>
    <%= link_to 'Join Project', new_project_team_path(@project), class: 'btn btn-primary' %>
<% end %>

我刚刚预测了那个项目 has_many :teams。正如您的代码所示。

如果我没理解错的话,你创建 TeamMember 模型只是为了防止用户多次加入一个项目?你也提到了Teams,但是他们的立场不明确

为什么一个项目不能 has_many 个用户,然后您通过 before_filter 或模型中的验证限制用户多次属于一个项目?

尝试:

- team_member = @project.teams.where(user_id: current_user.id).first
<% if team_member.present? %>
    <%= link_to 'edit role', edit_project_team_path(@project, team_member), class: 'btn btn-primary' %>
<% else %>
    <%= link_to 'Join Project', new_project_team_path(@project), class: 'btn btn-primary' %>
<% end %>

同时为了防止数据库中的不一致,我建议使用 uniqueness validations:

class Team
    belongs_to :project
    belongs_to :user
    validates :user_id, uniqueness: { scope: :project_id }
end

以后对你有很大帮助。也不要忘记添加 unique indices.