-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
はこれを行うには良い方法があるかもしれませ。
インスタンスは、日付フィールドを持っていると仮定すると、
を助けるべきです。私は、作成されたフィールドではなく、日付フィールドによって順序付けされたリトリートを必要とします。後退には多くの事例があり、したがって多くの日程を持つことができるからです。私はすべての退去を今日に最も近い日までに注文したい。 – dhaliman
それから、 'created_at'の代わりに' date'を使用します。私は –
を更新します。これは動作しません。リトリートは一切注文されません。 – dhaliman