Запросы и ссылки на таблицы соединений - PullRequest
0 голосов
/ 11 февраля 2020

Два вопроса:

1) У меня есть вид отступления /: id, где я могу отображать названия команд, которые прикреплены к указанному c отступлению. Я могу просмотреть имена команд с помощью следующего запроса в представлении:

<p>Teams: <%= @retreat.teams.pluck(:name).to_sentence %></p>

Однако вместо того, чтобы просто отображать имя, как мне отображать имя команды и ссылку на команду team /: id

2) В этом представлении отступлений /: id я также хотел бы отобразить пользователей, которые являются частью команды, но я действительно застрял, пытаясь присоединиться к go через sql присоединения и т. д. c.

модели

retreat.rb

class Retreat < ApplicationRecord
  belongs_to :user
  delegate :name, to: :user, prefix: true
  belongs_to :account

  validates :name, presence: true

  has_many :retreat_teams
  has_many :teams, through: :retreat_teams
  accepts_nested_attributes_for :retreat_teams
end

team.rb

class Team < ApplicationRecord
  belongs_to :account

  has_many :team_members
  has_many :users, through: :team_members
  accepts_nested_attributes_for :team_members

  has_many :retreats
  has_many :retreats, through: :retreat_teams
end

team_members.rb

class TeamMember < ApplicationRecord
  belongs_to :team
  belongs_to :user
end

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

1) У меня есть вид отступления /: id, где я могу отображать названия команд, которые прикреплены к указанному c отступлению. ... Однако, вместо того, чтобы просто отображать имя, как бы я отображал название команды и ссылку на команду team /: id

Не используйте .pluck, если вы на самом деле требуется только один столбец в виде массива или необработанные данные из нескольких столбцов без создания экземпляров модели. .pluck злоупотребляет и злоупотребляет. Не имеет смысла что-то выщипывать, если потом вам все равно придется извлекать остальные столбцы позже.

Вместо этого просто выполните итерации по экземплярам модели:

<% @resort.teams.each do |team| %>
  <%= link_to team.name, team %>
<% end %>

Если вы объявили маршрут с resources :teams. Rails определит маршрут сам по себе - это сила соглашения о конфигурации.

2) В этом представлении отступления /: id я также хотел бы отобразить пользователей, которые являются частью команда, но я действительно застрял, пытаясь присоединиться от go до sql, и т.д. c.

На самом деле вам не нужно выполнять какую-либо работу по присоединению. Просто попытайтесь загрузить ассоциацию, чтобы избежать n + 1 запросов:

def show 
  @resort = Resort.eager_load(teams: :users).find(params[:id])
end
<% @resort.teams.each do |team| %>
  <div class="team">
    <h3><%= link_to team.name, team %></h3>
    <h4>Members:</h4>
    <% if team.users.any? %>
    <ul>
      <%= team.users.each do |user| %>
      <li><%= link_to user.name, user %></li>
      <% end %>
    <ul>
    <% end %>
  </div>
<% end %>

Еще одно замечание по поводу именования

Имя TeamMember вызывает сожаление, так как подразумевает, что это фактическое лицо, которое является членом и не просто модель соединения.

Членство или позиция - лучший выбор имени.

class Team 
  has_many :memberships
  has_many :members, through: :memberships
end

class Membership
  belongs_to :team
  belongs_to :member, class_name: 'User'
end

class User
  has_many :memberships, foreign_key: :member_id
  has_many :teams, through: :memberships  
end

Это позволит вам перебирать team.members и фактически получать пользователей вместо некоторой модели соединения. Приведенный выше пример будет читать после рефакторинга:

def show 
  @resort = Resort.eager_load(teams: :members).find(params[:id])
end
<% @resort.teams.each do |team| %>
  <div class="team">
    <h3><%= link_to team.name, team %></h3>
    <h4>Members:</h4>
    <% if team.members.any? %>
    <ul>
      <%= team.members.each do |member| %>
      <li><%= link_to member.name, member %></li>
      <% end %>
    <ul>
    <% end %>
  </div>
<% end %>
0 голосов
/ 11 февраля 2020

Первая часть может быть выполнена следующим образом

<% retreat.teams.each do |team| %>
  <%= link_to(team.name, team_path(team.id)) %>  # or whatever the path helper is
<% end %>

Вторая часть, вы можете вместо этого выполнить этот запрос

@teams = Team.where(retreat_id: @retreat.id).includes(:users)

Затем в пользовательском интерфейсе вы можете показать вот так

<% @teams.each do |team| %>
  Team: <%= link_to(team.name, team_path(team.id)) %>  # or whatever the path helper is
  Team Users: <%= team.users.pluck(:name).to_sentence %>
<% end %>

Надеюсь, это поможет!

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