

### 前提・実現したいこと

以下のような関連付けをしているモデルがあります。  
Plan=>Course=>Lesson  
deviseのモデルUser  
中間テーブル  
\- course_plan  
\- bookmark

course_planモデルにpositonカラムがあります。  
bookmarkのindexページでpositionカラム順にbookmarkを並べ替えたいのですが、どのようにすればよいでしょうか？

[code]

    class Plan
      has_many :users
    
      has_many :course_plans, -> { order(position: :asc) }, dependent: :destroy
    
      has_many :courses, -> { includes(:course_plans).order('course_plans.position       ASC') }, through: :course_plans
    
    
     class CoursePlan
      belongs_to :course
      belongs_to :plan
    
    
     class Course < ActiveRecord::Base
      has_many :lessons, -> { order(chapter: :asc) }, dependent: :destroy
      accepts_nested_attributes_for :lessons
      has_many :course_plans
      has_many :plans, through: :course_plans
    
    
    class Lesson < ActiveRecord::Base
      belongs_to :course
      has_many :bookmarks
      has_many :bookmarked_users, through: :bookmarks, source: :user
    
    
    class Bookmark < ActiveRecord::Base
      belongs_to :user
      belongs_to :lesson
    
[/code]

### 試したこと

現在は苦肉の策で  
コースIDが若い順、同一コースの場合はレッスンIDが若い方を上にしています。

[code]

    def bookmarks
    @bookmarks = Bookmark.where(user_id: current_user.id).sort_bookmarks
    @bookmarks = Bookmark.joins(lesson:     [:course]).order("course_id").order("chapter").where(user_id: current_user.id)
      end
    
[/code]

`joins`や`includes`してみましたが、うまくいきませんでした。  
どなたか教えていただけると幸いです。

# 下記回答頂いて、やりたいことまでかなり近づきました!

しかし、これをviewでeach文で取り出したところ、同じブックマークしたレッスンが４つも出てきてしまいました。ログインしているユーザーがブックマークしたレッスンをcourse_planのposition順かつ同一コースの場合はレッスンIDが若い方を上に並べたいです。  
下記現在のコードです。

[code]

    controller.rb
    def bookmark
     @bookmarks = Bookmark.joins(lesson: { course: :course_plans }).order(CoursePlan.arel_table[:position].desc).where(user_id: current_user.id)
    end
    
[/code]

(bookmark.html.erb)

[code]

            <% if @bookmarks.blank? %>
          <div class="not_found">
            <%= "ブックマークしているレッスンはありません" %>
          </div>
        <% else %>
          <div id="collapseOne" class="panel-collapse collapse in">
            <div class="panel-body">
              <table id="memo_table" class="table">
                <thead>
                  <tr>
                    <th class="">コース名</th>
                    <th class="">ブックマークしたレッスン</th>
                  </tr>
                </thead>
                <tbody>
                  <% @bookmarks.each do |bookmark| %>
                    <% if bookmark.present? %>
                      <tr valign="top">
                        <td class="s12">
                          <%= link_to course_path(bookmark.lesson.course) do %>
                            <%= bookmark.lesson.course.title %>
                          <% end %>
                        </td>
                        <td class="s12">
                          <%= link_to lesson_path(bookmark.lesson) do %>
                            <%= bookmark.lesson.title %>
                          <% end %>
                        </td>
                      </tr>
                    <% end %>
                  <% end %>
                </tbody>
              </table>
            </div>
          </div>
        <% end %>
    
[/code]


CC BY-SA 3.0
2016-05-17T10:25:10.767
24931
2016-05-18T01:25:38.713
2016-05-18T01:25:38.713
15539
15539
question
ruby-on-rails
Railsで中間テーブルのカラム順に並べ替えたい


> course_planモデルにpositonカラムがあります。  
>  bookmarkのindexページでpositionカラム順にbookmarkを並べ替えたいのですが、どのようにすればよいでしょうか？

Bookmark から CoursePlan までを繋いで、CoursePlan の position で order すれば良いかと思います。

[code]

    irb(main):009:0> Bookmark.joins(lesson: { course: :course_plans }).order(CoursePlan.arel_table[:position].desc).to_sql
    => "SELECT \"bookmarks\".* FROM \"bookmarks\" INNER JOIN \"lessons\" ON \"lessons\".\"id\" = \"bookmarks\".\"lesson_id\" INNER JOIN \"courses\" ON \"courses\".\"id\" = \"lessons\".\"course_id\" INNER JOIN \"course_plans\" ON \"course_plans\".\"course_id\" = \"courses\".\"id\"  ORDER BY \"course_plans\".\"position\" DESC"
    
[/code]

ただ、提示されているコードを見ると、それ以外のものも多く含まれていらっしゃいますね。  
本当にやりたいことは、もしかして違うのでしょうか……？  
その場合は、別途質問を追加されることをお勧めします。


CC BY-SA 3.0
2016-05-17T14:08:25.173
24940
2016-05-17T14:08:25.173
7471
24931
answer