2016-04-07 5 views
0

Ich habe ein Tiermodell mit den folgenden Attributen.Gibt es eine Möglichkeit, ein Objekt mit mehreren Attributtypen nach einem einzigen Typ zu sortieren?

name: string 
sex: string 
acquired_at: datetime 
fed_at: datetime 
groomed_at: datetime 
played_with: datetime 
slept_at: datetime  
sold_at: datetime 

und ich möchte mit der letzten Datumzeit der Spalte angezeigt werden, sondern nur für die gefüttert, gepflegt, schlief, und Spalten spielen, die ständig mit den neuesten Zeiten zu ändern sein wird. Gibt es eine Möglichkeit, das Objekt wie Animal.last zu erhalten und die Spalte mit dem neuesten Datum aus den 4 Spalten zu holen?

Gerade jetzt habe ich nur eine if-Anweisung, die die 4 Spalten gegeneinander überprüft, aber es scheint lange und unnötig.

+0

Willkommen bei Stack Overflow. Bitte lesen Sie "[fragen]" und "[mcve]". Es ist wichtig, dass Sie Ihre Bemühungen zeigen, das Problem zu lösen. Was hast du geschrieben, um das zu lösen? SO ist keine "Schreibe meinen Code" -Website, sondern dient dazu, das Problem in dem von Ihnen geschriebenen Code zu beheben. Daher ist es notwendig, den minimalen Code zu zeigen, der zur Demonstration des Problems notwendig ist. –

+0

Ich frage mich, ob das machen jedes Ereignis eine Zeile in einer separaten Tabelle machen würde –

Antwort

1

Wenn Sie nicht wissen müssen, welche Spalte die älteste ist, die jüngste Zeitwert aus den vier Säulen, können Sie einfach max nutzen es aus dem Datensatz wählen attributes Hash umgewandelt:

Animal.last.attributes.values_at("fed_at", "groomed_at", "slept_at", "played_with").max 
# => Thu, 07 Apr 2016 00:18:04 CEST +02:00 

Wenn Sie den aktuellen Wert aus den vier Säulen sowie die Spaltennamen zu tun bekommen müssen, können Sie max_by verwenden das neueste Schlüssel-Wert-Paar des attributes Hash zu wählen:

Animal.last.attributes. 
    slice("fed_at", "groomed_at", "slept_at", "played_with"). 
    max_by{ |k,v| v } 
# => e.g. [ "groomed_at", Thu, 07 Apr 2016 00:18:04 CEST +02:00 ] 

Dies wird ein Array zurückgeben, bei dem der erste Eintrag der Attributname und der zweite Eintrag der Wert ist, der der späteste Zeitpunkt ist.

1
Animal.all.sort_by{|a| [a.fed_at, a.groomed_at, a.slept_at, a.played_with].max}.last 
+2

Formatierung ist sehr wichtig für die Lesbarkeit. Auch Code ohne Erklärung zu werfen hilft nicht annähernd so viel wie das Erklären * WARUM * der Code verwendbar ist und was er tut. Es ist, als würde man jemanden angeln lehren und ihm einen Fisch werfen. Wir möchten, dass sie wissen, wie sie das Problem auch in Zukunft vermeiden können. –

Verwandte Themen