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.
我设计了一个 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.