2017-06-29 11 views
-1

私はRetreatというRailsモデルを持っています リトリートにはモデルインスタンスとhas_manyアソシエーションがあり、リトリートには多くのインスタンスがあり、インスタンスはリトリートに属します。ここでアソシエイトモデルのアトリビュートを使用してRailsモデルを注文する

は、2のスキーマです:

create_table "instances", force: :cascade do |t| 
t.date "date" 
t.string "venue" 
t.string "schedule" 
t.decimal "price", precision: 8, scale: 2 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "retreat_id" 
t.index ["retreat_id"], name: "index_instances_on_retreat_id" 
end 

create_table "retreats", force: :cascade do |t| 
t.string "title" 
t.string "tagline" 
t.string "type_of" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.string "description" 
t.string "schedule" 
t.boolean "available", default: false 
end 

私は(それが今日に最も近いインスタンスの日付である)最も直接的なインスタンスの日付の観点リトリートモデルを注文したいです。リトリートにインスタンスがない場合、リトリートは最後に来ます。

どうすればいいですか?

編集#1:

これは私が最終的にそれをやった方法です:

def Retreat.order_by_upcoming(order='asc') 
    if order == 'asc' 
    Retreat.find_by_sql("select retreats.* from retreats left outer join \ 
    (select retreats.title, min(instances.date) as upcoming, 
     count(instances.date) from retreats left outer join instances on 
     retreats.id = instances.retreat_id where 
     instances.date >= '#{Date.today}' group by retreats.title) as s on \ 
     retreats.title = s.title order by case when s.upcoming is null then 1 
     else 0 end, s.upcoming, retreats.title") 
    elsif order == 'desc' 
    Retreat.find_by_sql("select retreats.* from retreats left outer join \ 
     (select retreats.title, min(instances.date) as upcoming, 
     count(instances.date) from retreats left outer join instances on 
     retreats.id = instance s.retreat_id where 
     instances.date >= '#{Date.today}' group by retreats.title) as s on \ 
     retreats.title = s.title order by s.upcoming desc, retreats.title") 
    end 
end 

はこれを行うには良い方法があるかもしれませ。

答えて

0

これはRetreathas_manyInstance

+0

インスタンスは、日付フィールドを持っていると仮定すると、

Retreat.joins(:instances).group('retreats.id').order('MAX(in‌​stances.date) desc') 

を助けるべきです。私は、作成されたフィールドではなく、日付フィールドによって順序付けされたリトリートを必要とします。後退には多くの事例があり、したがって多くの日程を持つことができるからです。私はすべての退去を今日に最も近い日までに注文したい。 – dhaliman

+0

それから、 'created_at'の代わりに' date'を使用します。私は –

+0

を更新します。これは動作しません。リトリートは一切注文されません。 – dhaliman

関連する問題