Rails has_many через запрос, с двумя ссылками, иначе говоря, используя атрибут таблицы - PullRequest
2 голосов
/ 06 мая 2019

Я ищу способ запроса модели на основе детей в ассоциации 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 дляобеспечить связь между пользователем и Squad, чтобы он мог хранить информацию о членстве, такую ​​как роль, должность, номер и т. д.

Цель состоит в том, чтобы Member модель store User информация о членстве, поскольку она относится клюбой Squad.Пользователь может быть владельцем одного отряда, быть членом другого и не быть участником еще одного отряда.

Я пытаюсь отобразить ссылку «Присоединиться» в моем index.html.erb для всех пользователей.которые не имеют никакого членского соединения с отрядом.

В настоящее время работает с

<% @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: основы ассоциации - есть много через ассоциацию

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Хотите показать кнопку, если зарегистрированный пользователь не является членом каждого отряда?Если это так ...

has_many ассоциация предоставляет метод other_ids, который возвращает массив идентификаторов связанных объектов (в вашем случае squad.user_ids).Таким образом, вы можете проверить, находится ли идентификатор текущего пользователя в этом массиве:

<% @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 %>
3 голосов
/ 06 мая 2019
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 })

Чтобы запросить пользователей, которыеесть запись участника, но нет члена целевой команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...