Ich habe ein Rails-Modell mit der Bezeichnung Retreat Das Retreat hat eine has_many-Verknüpfung mit der Modellinstanz, sodass Retreat viele Instanzen und Instanzen zu Retreats hat.Bestellung eines Rails-Modells mit einem Attribut in einem Partnermodell
Hier ist das Schema der beiden:
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
Ich möchte das Retreat-Modell in Bezug auf den Zeitpunkt der unmittelbarste Instanz bestellen (dass das Datum einer Instanz am nächsten ist heute). Wenn ein Rückzug keine Instanz hat, kommt er in der Reihenfolge zuletzt.
Wie kann ich das tun?
bearbeiten # 1:
Dies ist, wie ich es endlich tat:
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
sein kann es einen besseren Weg, dies zu tun ist.
Instanz Unter der Annahme hat ein Datumsfeld helfen sollte. Ich möchte Retreats nach dem Datumsfeld und nicht nach dem created_at-Feld sortieren. Da kann ein Retreat viele Instanzen und somit viele Daten haben. Ich möchte alle Retreats geordnet nach dem Datum, das dem Today am nächsten ist. – dhaliman
dann verwenden Sie "date" anstelle von "created_at", ich werde –
aktualisieren Dies funktioniert nicht. Retreats werden überhaupt nicht bestellt. – dhaliman