2011-01-10 6 views
1

ich einen JSON-String mit einer Ebene der Verbände produzieren will:to_json: include auf aktive Datensatz erfordert Datenbank

@lines = Line.joins(:mems)\ 
      .where("  lines.document_id = ? 
         AND lines.text <> 'root' 
         AND mems.review_after < ?", params[:id], Time.now())\ 
      .to_json :include => :mems 

Mein Entwicklungsprotokoll wird wie folgt dar:

Line Load (0.4ms) SELECT `lines`.* FROM `lines` INNER JOIN `mems` ON `mems`.`line_id` = `lines`.`id` WHERE (lines.document_id = '30' 
AND lines.text <> 'root' 
AND mems.review_after < '2011-01-10 04:14:59') 
    Mem Load (0.2ms) SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 49) 
    Mem Load (0.3ms) SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 50) 
    Mem Load (0.2ms) SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 51) 
    Mem Load (0.3ms) SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 52) 
    Tag Load (0.1ms) SELECT `tags`.* FROM `tags` WHERE (`tags`.`id` = 8) LIMIT 1 
Rendered documents/review.erb within layouts/application (11.3ms) 

Wie Sie sehen können, Das ActiveRecord-Objekt erzeugt eine einzelne Abfrage mit einem inneren Join. Die to_json-Methode fragt jedoch das zugeordnete Modell für jeden Leitungsdatensatz einzeln ab.

Gibt es eine Möglichkeit, diese doppelten Abfragen zu vermeiden, ohne eine benutzerdefinierte Serialisierungsmethode zu schreiben?

Antwort

1

Dies liegt daran, :includeeifrig Lasten verwandte Objekte aus der Datenbank, müssen Sie es auf Ihrer Original Abfrage verwenden.

Die Lösung ist einfach: includes verwenden:

@lines = Line.includes(:mems)\ 
     .where("lines.document_id = ? 
       AND lines.text <> 'root' 
       AND mems.review_after < ?", params[:id], Time.now())\ 
     .to_json :include => :mems 
+0

Wie verwende ich to_json auf meiner ursprünglichen Abfrage? – joshs

+0

danke für den Hinweis. das hat funktioniert: @lines = Line.includes (: mems) ... – joshs

+0

heh tut mir leid - die to_json Methode nimmt auch noch das Original arg:: include =>: mems – joshs

Verwandte Themen