我正在寻找一种通过关联在has_many中基于子级查询模型的方法。
我有这些型号
class User < ApplicationRecord
has_many :members
has_many :squads, through: :members
end
class Squad < ApplicationRecord
has_many :members
has_many :users, through: :members
end
class Member < ApplicationRecord
belongs_to :user
belongs_to :squad
end
我基本上是使用Member类来提供User和Squad之间的关系,因此它可以保存成员信息,例如角色,职位,号码等。
目标是使Member
模型商店User
成员资格信息与任何Squad
相关。用户可以是一个小队的所有者,可以是另一个小队的成员,而不能是另一个小队的成员。
我试图在index.html.erb中为所有与小队没有成员连接的用户显示一个Join链接。
当前正在与
合作<% @squads.each do |squad| %>
<td><%= squad.name %></td>
<% if Squad.includes(:members).where( 'members.user_id' => params[:users]).exists? %>
<td><%= link_to 'Join', join_squad_path(:id => squad) %></td>
<% end %>
<% end %>
主线为
<% if Squad.includes(:members).where( 'members.user_id' => params[:users]).exists? %>
还尝试了诸如
User.includes(:squads, :members).where('squads.id = ? AND members.users = ?', squad, current_user)
u = squad.users.includes(:member).where('member.user = ?', current_user)
Member.where.not("squad = #{squad.id}").find(user: current_user.id)
我每个| squad |都有一个实例变量并为登录用户提供current_user.id(使用Devise)
引用Ruby on Rails Guide: Association Basics - the has many through association
答案 0 :(得分:3)
User.includes(:members).where(members: { id: nil }).or(User.includes(:members).where.not(members: { squad_id: squad.id }))
说明:
User.includes(:members).where(members: { id: nil })
要查询没有成员记录(不属于小队)的用户
User.includes(:members).where.not(members: { squad_id: squad.id })
查询具有成员记录但没有目标小队成员的用户。
答案 1 :(得分:3)
如果登录的用户不是每个小队的成员,是否要显示按钮?如果是这样...
has_many
关联提供了方法other_ids
,该方法返回关联对象ID的数组(在您的情况下为squad.user_ids
)。因此,您可以检查当前用户的ID是否在该数组中:
<% @squads.each do |squad| %>
<td><%= squad.name %></td>
<% unless squad.user_ids.include?(current_user.id) %>
<td><%= link_to 'Join', join_squad_path(id: squad) %></td>
<% end %>
<% end %>