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

Я пытаюсь сделать две вещи:

  1. запросить атрибут из внутренней таблицы соединений в консоли Rails.
  2. запрос и отображение атрибута в представлении.

Это мои модели:

retreat.rb:

class Retreat < ApplicationRecord
  belongs_to :user
  belongs_to :account

  validates :name, presence: true

  has_many :retreats_teams
  has_many :teams, through: :retreats_teams
  accepts_nested_attributes_for :retreats_teams
end

retreats_team.rb:

class RetreatsTeam < ApplicationRecord
  belongs_to :team
  belongs_to :retreat
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: :retreats_teams
end

В консоли Rails, если я наберу:

Retreat.last.teams

, я получу вывод:

irb(main):008:0> Retreat.last.teams
  Retreat Load (0.9ms)  SELECT "retreats".* FROM "retreats" ORDER BY "retreats"."id" DESC LIMIT $1  [["LIMIT", 1]]
  Team Load (0.9ms)  SELECT "teams".* FROM "teams" INNER JOIN "retreats_teams" ON "teams"."id" = "retreats_teams"."team_id" WHERE "retreats_teams"."retreat_id" = $1 LIMIT $2  [["retreat_id", 38], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Team id: 56, name: "My house", account_id: 2, created_at: "2020-02-10 15:57:25", updated_at: "2020-02-10 15:57:25">]>
irb(main):009:0> 

Как получить имя команды: " Мой дом"?

Также здесь может отображаться много команд.

Ответы [ 2 ]

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

Слово об именах

Соглашение об именах для моделей объединения: SingularSingular. Таблица должна быть названа singular_plural. has_and_belongs_to_many - единственная часть Rails, которая на самом деле использует схему именования oddball plural_plural.

RetreatsTeam  # bad
RetreatTeam   # better

Еще лучше то, что на самом деле вы даете своим таблицам объединения значимые имена, а не просто имена-заполнители.

1) запрос атрибута из внутренней таблицы соединений в Rails Console.

Поскольку связь между Retreat и RetreatsTeams в одном для многих, вы можете на самом деле получать только агрегаты. В противном случае, какой атрибут должен извлечь из первой строки, последней строки или всех строк?

Так, например, вы можете сделать:

Retreat.joins(:retreats_teams)
       .select('retreats.*', 'COUNT(retreats_teams.*) AS retreats_teams_count') 

Если вы храните больше данных на присоединяемая таблица, которую вы хотите отобразить, вы хотите перебрать в объединяющей таблице:

@retreat = Retreat.eager_load(retreats_teams: :teams).first
@retreat.retreats_teams.each do |rt|
  puts rt.foo
  puts rt.team.name
end

2) запрашивать и отображать атрибут в представлении.

В Rails вы обычно просто извлекаете записи в контроллере и затем просматриваете их в представлении:

class ResortsController < ApplicationController
  def show
    @resort = Resort.includes(:teams).find(params[:id])
  end
end

# app/views/resorts/show.html.erb
<h1><%= @resort.name %></h1>
<h2>Teams</h2>
<% if @resort.teams.any? %>
  <ul>
  <% @resort.teams.each do |team| %>
    <li><%= team.name %></li>
  <% end %>
  </ul>
<% else %>
  <p>This resort has no teams</p>
<% end %>
0 голосов
/ 11 февраля 2020

#teams возвращает коллекцию командных объектов. Самое простое решение - позвонить командам first, чтобы получить первую команду в коллекции:

Retreat.last.teams.first.name

=> "My house"

Но если вам нужны все имена в teams, вы можете использовать pluck. Это позволит вам сделать это:

retreat = Retreat.last
foo = Team.create(name: 'Foo')
bar = Team.create(name: 'Bar')
retreat.teams << foo
retreat.teams << bar

retreat.teams.pluck(:name).to_sentence

=> "My house, Foo, and Bar"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...