Rails has_many通过查询,又有两个引用,也使用通过表属性

时间:2019-05-06 04:01:36

标签: sql ruby-on-rails ruby ruby-on-rails-5

我正在寻找一种通过关联在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

2 个答案:

答案 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 %>