2016-05-04 7 views
1

Я работаю над приложением глубокой ассоциации. Строка относится к уровню планирования, уровень планирования относится к одной или нескольким программам.Отображение has_many,: через записи ассоциации

class Program < ActiveRecord::Base 
    has_and_belongs_to_many :planning_levels 
    has_many :stories, :through => :planning_levels 
end 

class PlanningLevelsPrograms < ActiveRecord::Base 
end 

class PlanningLevel < ActiveRecord::Base 
    has_and_belongs_to_many :programs 
    has_many :stories 
end 

class Story < ActiveRecord::Base 
    belongs_to :planning_level 
end 

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

Я не уверен, как получить доступ к модели Story со страницы программы.

Следующие работы отлично подходят для отображения каждого уровня планирования, принадлежащего Программе.

<% @program.planning_levels.each do |p| %> 
    <p><%= p.name %></p> 
<% end %> 

... но я не знаю, как сделать следующую работу для каждого отображаемого уровня планирования. Как мне получить доступ к модели Story из программы? Есть ли что-то в контроллере программы, которое мне не хватает. Заранее спасибо!

@program.planning_level.stories.count(:id) 
+0

'@program.planning_levels.each {| p | p.stories.count} 'должен сделать это. '@ program' не отвечает на' planning_level', потому что это отношение 'has_many', а' ActiveRecord :: Relation', возвращаемое 'planning_levels', не знает о' story', но каждый экземпляр, содержащийся в Relation. Обратите внимание, что это может вызвать проблему «n + 1», поэтому вы можете предварительно загрузить эти данные при настройке '@ program' – engineersmnky

ответ

0

каждого уровень планирования:

<% @program.planning_levels.each do |planning_level| %> 
    <p><%= planning_level.name %></p> 
    # Aggregate Story count for each planning_level 
    <p><%= planning_level.stories.count %></p> 
<% end %> 

Совокупный отсчет истории для @program (если вы хотите):

@program.stories.count 

Надеется, что это может помочь вам.

0

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

<% @program.planning_levels.each do |planning_level| %> 
    <p><%= planning_level.name %> with <%= planning_level.stories.count %> stories</p> 
    <% planning_level.stories.each do |story| %> 
    <p><%= story.name %></p> 
    <% end %> 
<% end %> 

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

Например, вы могли бы рассмотреть форматирование это как вложенный список, например, так:

<% @program.planning_levels.each do |planning_level| %> 
    <ul> 
    <li>Planning Level: <%= planning_level.name %> with <%= planning_level.stories.count %> stories 
     <ul> 
     <% planning_level.stories.each do |story| %> 
      <li>Story: <%= story.name %></li> 
     <% end %> 
     </ul> 
    </li> 
    </ul> 
<% end %> 

Добавление CSS class и id атрибуты дадут вам возможность добавлять стили к элементам, чтобы дать ваш интерфейс какое-то чутье ,