Railsで中間テーブルのカラム順に並べ替えたい
前提・実現したいこと
以下のような関連付けをしているモデルがあります。
Plan=>Course=>Lesson
deviseのモデルUser
中間テーブル
- course_plan
- bookmark
course_planモデルにpositonカラムがあります。
bookmarkのindexページでpositionカラム順にbookmarkを並べ替えたいのですが、どのようにすればよいでしょうか?
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
試したこと
現在は苦肉の策で
コースIDが若い順、同一コースの場合はレッスンIDが若い方を上にしています。
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
joins
やincludes
してみましたが、うまくいきませんでした。
どなたか教えていただけると幸いです。
下記回答頂いて、やりたいことまでかなり近づきました!
しかし、これをviewでeach文で取り出したところ、同じブックマークしたレッスンが4つも出てきてしまいました。ログインしているユーザーがブックマークしたレッスンをcourse_planのposition順かつ同一コースの場合はレッスンIDが若い方を上に並べたいです。
下記現在のコードです。
controller.rb
def bookmark
@bookmarks = Bookmark.joins(lesson: { course: :course_plans }).order(CoursePlan.arel_table[:position].desc).where(user_id: current_user.id)
end
(bookmark.html.erb)
<% 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 %>