2017-06-29 2 views
-1

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.

Antwort

0

Diese

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

Retreathas_manyInstance s

+0

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

+0

dann verwenden Sie "date" anstelle von "created_at", ich werde –

+0

aktualisieren Dies funktioniert nicht. Retreats werden überhaupt nicht bestellt. – dhaliman

Verwandte Themen