我有一个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 将团队视为团队成员(团队建议一组用户,但每个团队实际上仅由一个用户组成)
答案 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
或模型中的验证限制用户多次属于某个项目?