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

时间:2015-09-07 10:19:51

标签: ruby-on-rails devise associations

我有一个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 将团队视为团队成员(团队建议一组用户,但每个团队实际上仅由一个用户组成)

3 个答案:

答案 0 :(得分:1)

您正试图从关联对象中找到user@project.teams.user此处@project.teams将返回多个对象而不是单个对象。因此,您应该将@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:团队。你的代码看起来像。

答案 1 :(得分:1)

尝试:

- 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

答案 2 :(得分:0)

如果我理解得很好,那么您创建TeamMember模型只是为了防止用户多次加入项目?你也提到了团队,但他们的立场并不清楚。

为什么项目has_many用户无法通过before_filter或模型中的验证限制用户多次属于某个项目?