2017-02-28 30 views
0

我有一個模型經驗教訓。每個課程都可以通過下拉字段分配給一個部分(字符串1-10,:部分)。該部分是Lessons表的一列。一節課屬於一個模型課程(通過:course_id)Double each.do循環遍歷相同的模型

我想在一個側邊欄中顯示這種結構,分成部分下面的每個部分的經驗教訓,只有屬於該特定課程的教訓(通過:course_id)看截圖。

Screenshot of Sidebar, currently looping over the same database entries

用下面的代碼,我得到的已經在入門課已選擇部分的數量(這裏是2,第1和2),但代碼循環在相同的教訓。

<div id="sidebar-nav"> 
    <ul id="dashboard-menu"> 
    <strong>Curriculum</strong><br><br> 
    <% Lesson.where(course_id: @course).select(:section).each do |section| %> 
    <div class="panel curriculum-navigation__section" ng-class=""> 
     <div class="panel-heading" role="tab" id="lecture-3"><%= @lesson.section %>. Section</div> 

     <ol> 
     <% Lesson.where(course_id: @course).each do |lesson| %> 
     <br> 

     <li><%= link_to lesson.name, lesson %></li> 
     <% end %> 
     </ol><br> 
    </div> 
    <% end %>  
    </div> 

有人能指點我一個解決方案嗎?我是否正確地解決這個問題?

回答

1

看起來你的數據結構倒退了。如果您有:

- Course 
    - Section 
    - Lesson 

爲分層結構,那麼你應該定義和使用它的方式讓你的代碼看起來謊言:

class Course 
    has_many :sections 
    has_many :lessons, through: :sections 
end 
class Section 
    belongs_to: :course 
    has_many :lessons 
end 
class Lesson 
    belongs_to :section 
end 

<% @course.sections.each do |section| %> 
    ... 
    <% sections.lessons.each do |lesson| %> 
     ... 
    <% end %> 
<% end %>  

---更新---

如果你有沒有科模型,那麼我會考慮做以下幾點:

class Course 
    def sections 
    lessions.map(&:section).uniq 
    end 
    def lessons_for_section(section) 
    lessons.filter { |l| l.section == section } 
    end 
end 

<% @course.sections.each do |section| %> 
    ... 
    <% @course.lessons_for_section(section).each do |lesson| %> 
     ... 
    <% end %> 
<% end %>  

(我做了這樣的假設,y ou總是要與所有課程一起工作,如果不是這樣,將會更有效地寫作範圍查詢)

+0

所以現在Section不是模型。它只是Lesson模型的字符串列。如果可能的話,我儘量避免創建一個Section模型...從長遠來看,我可能會以這種方式實現它,但想知道是否有一個解決方案,只有課程模型 – Jan

+0

查看我上面的更改 –