Отображение has_many через - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть быстрый вопрос о том, как отображать множество ассоциаций.

У меня есть нижеуказанные ассоциации, установленные в 3 разных моделях

assignment.rb 
class Assignment < ApplicationRecord
 belongs_to :stock
 belongs_to :portfolio
end

portfolio.rb
class Portfolio < ApplicationRecord
 has_many :assignments
 has_many :stocks, through: :assignments
 accepts_nested_attributes_for :stocks
end

stock.rb
class Stock < ApplicationRecord
 has_many :assignments
 has_many :portfolios, through: :assignments
end

и я пытаюсь отобразить все акции, которые есть у портфеля, на странице индекса портфеля после того, как вы назначите акцию в портфель

У меня сейчас есть это в моем представлении индекса портфеля

<% @portfolios.stocks.each do |a|%>
  <p><%= a.ticker %></p>
<%end%>

но я получаю ошибку ниже

undefined method `stocks' for #<Portfolio::ActiveRecord_Relation:0x51f0fd8>

я не понимаю, что я делаю неправильно

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

ActiveRecord::Relation - это массив, похожий на объект, содержащий несколько записей. В вашем случае Portfolio экземпляров.

Для вызова методов экземпляра в записях (например, #stocks) необходимо выполнить итерацию по коллекции:

<% @portfolios.each do |portfolio|%>
<div class="portfolio">
  <% portfolio.stocks.each do |stock| %>
    <p><%= stock.ticker %></p>
  <% end %>
</div>
<% end %>

При этом обязательно используйте .includes или .eager_load до , избегайте запроса N + 1 :

def index
  @portfolios = Portfolio.includes(:stocks).all
end
0 голосов
/ 11 ноября 2018

Здесь вы определили, что у вас есть many to many отношение между portfolios и stocks.

, что означает, что для каждого портфеля у вас есть несколько записей акций .

Итак, чтобы получить все акции, относящиеся к портфелю, вы должны будете использовать some_porfolio.stocks

ваш код не работает, потому что вы используете массив active_record, и вы просите его выбрать акции для всех портфелей за один раз, но связь не между массивом active_records и массивом active_records , Вместо этого он находится между active_record, удерживающим foreign_key другой активной записи.

Если вы хотите показать список акций против записи портфеля, то лучше использовать

<% @portfolios.each do |porfolio| %>
  <!--- your html code for each portfolio -->
  ID: <%= portfolio.id %>
  <!--- your html code for each stock associated to this portfolio -->
  <% portfolio.stocks.each do |stock| %>
    <!--- your html code for each stock -->
    ID: <%= stock.id %>
  <% end %>  
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...