Страницы

Поиск по вопросам

среда, 22 января 2020 г.

вывод в show из соединительной таблицы

#ruby_on_rails


Привет! 
есть 3 модели (RailwayStation, Route и джоин таблица RailwayStationsRoute)

class RailwayStationsRoute < ApplicationRecord
  belongs_to :railway_station
  belongs_to :route 

class Route < ApplicationRecord
  has_many :railway_stations_routes
  has_many :railway_stations, through: :railway_stations_routes

class RailwayStation < ApplicationRecord
  has_many :railway_stations_routes
  has_many :routes, through: :railway_stations_routes


задача: во вьюхе Route (show.html.erb) вывести список станций по порядковому номеру
(station_number - поле интеджер в соединительной таблице)

если во вьюхе show написать код:

<% @route.railway_stations.each do |station| %>
<%= station.railway_stations_routes.inspect %><%= station.title %>


выведет: 

ActiveRecord::Associations::CollectionProxy [#]Saint-Petersburg


где присутствует station_number

но если inspect изменить на station_number то выкинет ошибку:

undefined method `station_number' for #


тк нет метода station_number у модели railwayStation

далее создал скоуп в соедидительной таблице:

scope :ttt, -> { select('railway_stations.*, 
               railway_stations_routes.station_number') }


изменил код во вьюхе на:

<%= station.railway_stations_routes.ttt %><%= station.title %>


выводит:

#Saint-Petersburg


вопрос в том Как облагородить этот самый вывод? что бы показывало цифру (station_number) 
    


Ответы

Ответ 1



У вас здесь проблема скорее с наложением предметной области на программирование, чем непосредственно с программированием. С вашим скоупом проблема в том, что у одной модели внезапно возникли поля от другой. Пункт маршрута внезапно приобрёл черты вокзала. Если б у вас были нужные для вывода методы в модели вокзала, у пункта маршрута, полученного таким образом, их бы не было. Уберите этот скоуп. Совсем. В нём нет необходимости, при этом от него есть прямой вред. Попробую сломать ваше заблуждение: вы выводите не станции. Вы выводите пункты маршрута, каждый из которых связан с одной станцией. Посему, вам ничто не мешает сделать так: <% @route.railway_stations_routes.each do |rsr| %> <%= rsr.station_number %><%= rsr.railway_station.title %> ...кроме, разве что, соображений производительности, а именно проблемы N+1 запроса. Но об этой проблеме и её решении вам обстоятельно расскажут гайды. Но, коротко, вот: <% @route.railway_stations_routes.includes(:railway_station).each do |rsr| %>

Ответ 2



в итоге: вьюха show (route) - ttt вызываю на цикл each <% @route.railway_stations.ttt.each do |station| %> <%= station.station_number %> - <%= station.title %> railway_station.rb - перенес скоуп сюда scope :ttt, -> { select("railway_stations.*, railway_stations_routes.station_number") }

Комментариев нет:

Отправить комментарий