double each.do循环遍历相同的模型

时间:2017-02-28 07:47:33

标签: html ruby-on-rails loops each

我有一个模型课程。可以通过下拉字段将每个课程分配给一个部分(1-10,:部分之间的字符串)。该部分是Lessons表的一列。课程属于模型课程(via:course_id)

我正在尝试在补充工具栏中显示此构造,分为部分,部分下方的每个部分的课程以及仅属于该特定课程的课程(via: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 个答案:

答案 0 :(得分: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 %>    

---更新---

如果您没有Section模型,那么我会考虑执行以下操作:

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 %>    

(我已经假设你总是会参与所有的课程,如果不是,上面会更有效地写成一个范围的查询)