2009-06-24 8 views
2

Ich bin ein Bericht in einer Ruby on Rails-Anwendung erstellen und ich habe Schwierigkeiten zu verstehen, wie eine Unterabfrage verwenden.Unterabfrage in Rails-Bericht Generation

Jede 'Umfrage' has_many 'SurveyResponses' und es ist einfach genug, diese zu erhalten, aber ich muss sie nach einem der Felder 'Jobcode' gruppieren, da ich nur die Informationen zu einem einzigen Jobcode melden möchte in einer Zeile im Bericht.

Allerdings muss ich auch die konstituierenden Daten kennen, die die Summen für diesen Jobcode ausmachen. Der Grund dafür ist, dass ich Daten wie Mediane und Standardabweichungen berechnen muss und daher die Werte kennen muss, die die Summe ausmachen.

Mein Denken ist, dass ich die verschiedenen Jobcodes abrufe, die für die Umfrage gemeldet wurden, und dann, wenn ich diese durchlaufen habe, lade ich die individuellen Antworten für jeden Jobcode ab.

Ist dies der richtige Weg, oder sollte ich einer anderen Methode folgen?

Antwort

2

Sie könnten einen benannten Bereich verwenden bekommen die Gruppen von Antworten zu vereinfachen:

named_scope :job_group, lambda{|job_code| {:conditions => ["job_code = ?", job_code]}} 

Setzen Sie, dass in Ihrem Antwortmodell, aand es wie folgt verwendet werden:

job.responses.job_group('some job code') 

und Sie erhalten eine Reihe von Antworten. Wenn Sie schauen, den Mittelwert des Wertes eines des Attributs auf den Antworten zu erhalten, können Sie Karte verwenden:

r = job.responses.job_group('some job code') 
r.map(&:total) 
=> [1, 5, 3, 8] 

Alternativ, können Sie es schneller benutzerdefinierte SQL zu schreiben, um zu erhalten der Mittelwert/Durchschnitt/Summe der Gruppen von Attributen. Das Durchfahren von Schienen für diese Art von Arbeit kann zu einer erheblichen Verzögerung führen.

ActiveRecord::Base.connection.execute("Custom SQL here") 
1

Sie können auch Model.find_by_sql verwenden()

Zum Beispiel:

class User < Activerecord::Base 
    # Your usual AR model 
end 

...

def index 
    @users = User.find_by_sql "select * from users" 
    # etc 
end