2011-01-07 3 views
1

Ich habe eine einfache Fragestellung. Ich möchte dies als Rahmen tun:Konvertieren einer einfachen Abfrage in einen trickreich benannten Bereich in RoR

if article.responses.blank? 
     return false 
elsif article.responses.last.passed.eql?(false) 
     return true 
else 
    return false 
end 

So auf dem Artikel Modell, das ich so etwas wie dies haben würde:

scope :failed_response, { 
    :joins=>[:responses], 
    :conditions=>["responses.passed = ?", false] 
    } 

Das Problem ist, dass ich nur Instanzen wollen, wo die jüngsten Antwort fehlgeschlagen. Ich bin mir sicher, dass dies eine Möglichkeit ist, dies entweder mit einer ausgeklügelten Sortierung oder einer Art verschachtelter Abfrage zu tun, aber ich stecke fest. Vielen Dank!

Antwort

1

Das einzige, was ich im Moment denken kann, ist eine Unterabfrage in dem Anwendungsbereich:

named_scope :failed_response, { 
    :conditions => ["(SELECT passed FROM responses WHERE 
    responses.article_id = articles.id ORDER BY id DESC LIMIT 1) = ?", false] 
} 

Ich denke, es ist eine Art von Rails Art und Weise, die ein bisschen schöner oder eine Art und Weise, ohne eine Unterabfrage ist, aber Daran kann ich im Moment nicht denken. Hoffe das hilft aber. :)

0

Ich würde sagen, um es als clever zu machen. Verfügen über eine Instanzmethode, um die letzte Antwort für diesen einzelnen Artikel zurückzugeben, und dann über eine andere Instanzmethode, um den Wahrheitswert zurückzugeben, ob dieser Wert wahr oder falsch ist. Es ist möglicherweise nicht so schnell wie ein Namensbereich mit einer einzigen SQL-Zeile. Aber ich mache es immer noch den klaren Weg für bessere Wartbarkeit/Verständnis.

Verwandte Themen