today
に多数のtasks
があるモデル関係があります
ユーザーのtoday
オブジェクトを取得し、tasks
を含めて、それらをすべてJsonにレンダリングしようとしています。 respond_with block
はhtmlページのレンダリングにも使用されるため、tasks
オブジェクト内のtoday
を注文することを決定するまで、これはすべてうまくいきました。 tasks
を含めて注文する方法はありますか?
私はこのようなものを試しています:
class TodaysController < ApplicationController
respond_to :html, :json
def show
@today = Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).order(:priority).first
respond_with @today, :include => :tasks
end
end
これはすべてを正しく取得しますが、タスクをまったく順序付けていないようです。
これは私が以前持っていたものです(それはうまくいきましたが、順序がありませんでした):
class TodaysController < ApplicationController
respond_to :html, :json
def show
@today = current_user.today
respond_with @today, :include => :tasks
end
end
私はデータを取得して後でこのように並べ替えることができることを知っています:
@today = current_user.today
@today.tasks.sort!{|a,b| a.priority <=> b.priority }
これは機能し、テストに合格しますが、これを解決するActiveRecordの方法を望んでいました。
Today
モデルでこれを試してください:
has_many :tasks, :order => 'priority DESC'
編集:以下のコメントで述べたように、Rails 4+)では、これは次のようになります。
has_many :tasks, -> { order(:priority => :desc) }
( 詳細はこちら )
直接的な解決策は、tasks
の前にpriority
テーブル名を含めることです。
Today.where(:user_id => current_user.id).includes(:tasks).order('tasks.priority').first
# joins(:tasks) is not required
または、テーブル名をハードコーディングしたくない場合は、Task
モデルのスコープとマージできます。
Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first
# joins(:tasks) here is required
また、User
モデルにhas_many: todays
を追加してwhere
句を破棄し、次の操作を実行できます。
current_user.todays.includes(:tasks).order('tasks.priority').first
# or
current_user.todays.joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first
ただし、優先順位による順序付けのみ/常に必要で、他の異なる順序付けが必要ない場合は、has_many :tasks
にorder
を追加する方が簡単です。