2012-04-02 4 views
0

In meiner Rails-Anwendung verwenden, Ich bin eine Union-Abfrage durchführen Model.find_by_query mitUnterschied in dem Abfrageergebnis während Model.find_by_query in Rails

Da Tabellen haben unterschiedliche Anzahl von Spalten, i virtuelle Spalten verwendet.

Meine Abfrage sieht aus wie

"SELECT id, 'N/a' AS start_time, 'N/a' AS end_time, 'N/a' AS 
STATUS , project_id, spent_on AS DATE, user_id, hours AS spent_time, comments AS 
COMMENT , activity_id 
FROM table1 
WHERE spent_on > DATE_ADD(CURDATE() , INTERVAL -30 
DAY) 
AND user_id =80 
UNION (

SELECT id, start_time, end_time, 
STATUS , project_id, DATE, user_id, spent_time, 
COMMENT , activity_id 
FROM table2 
WHERE user_id =80 
AND DATE > DATE_ADD(CURDATE() , INTERVAL -30 DAY) 
)" 

ich eine korrekte Ausgabe bin immer wenn die Abfrage in MySQL läuft, aber die gleiche Abfrage mit Model.find_by_sql Laufen gibt mir verschiedene Ausgabe

Dies ist der Ausgang i läuft die Abfrage in mysql

enter image description here

während Model.find_by ist immer _sql() gibt nur wenige Spalten,

<Task id: 6153, start_time: "2000-01-01 00:00:00", end_time: "2000-01-01 00:00:00", project_id: 6, spent_time: 10.0, user_id: 80, activity_id: 9> 

Beachten Sie auch, dass es auch eine Diskrepanz in den Werten. anstelle von 'N/a' bekomme ich "2000-01-01 00:00:00" in Zeitfeldern.

Ich fand heraus, dass ‚N/A‘ umgewandelt wird immer auf „2000-01-01 00:00:00“, weil Feldtyp ist die Zeit. Rails konvertiert es in einen Zeitwert.

Aber ich dies außer Kraft setzen kann?

Wie kann ich gewünschte Ausgabe zu erhalten? jede andere Möglichkeit zum Ausführen solcher rohen Abfragen?

Kommentare bitte?

Thnx.

+0

Welche Version von Schienen arbeiten Sie? –

+0

seine Rails 2.3.14 –

+0

Ich fand heraus, dass die Spalten ignoriert wurden, die mit Model nicht übereinstimmten, wenn Model.find_by_sql() ausgeführt wurde. –

Antwort

0

Okay, so gibt es zwei Probleme, die ich hier sehen kann, ist, dass der Ergebnismenge falsch typisieren wird, und das zweite ist, dass einige Spalten fehlen.

Sie haben zwei Möglichkeiten, soweit ich für die Schublade gesteckt Problem sehen:

  1. Access die Daten ohne Schublade gesteckt. Jedes Attribut auf einem Schienen-Modell hat eine '_before_type_cast' Attribut entspricht (zB task.start_date und task.start_date_before_type_cast, task.user_id und task.user_id_before_type_cast usw.), verwendet, um diese Attribute statt und man sollte "N/A" anstelle von „2000-01-01 00 sehen : 00: 00" (N/A ‚wie new_start_date auf diese Weise Schienen sollte es als Ausgangs Spalte lesen und wird jede Schublade gesteckt auf es nicht
  2. einen anderen Alias ​​zB SELECT) verwenden‘.

Für Sie zweite Ausgabe, während die Spalten möglicherweise nicht dort zu sein, das ist nur, weil die inspect Methode (das ist, was den Code druckt Sie oben setzen) nur über Spalten auf der Aufgabe Datenbanktabelle kennen, nicht die Spalten in Ihrer SQL-Abfrage. Die Daten sind jedoch vorhanden und können wie jedes andere Attribut abgerufen werden.

>> results = Model.find_by_sql('SELECT columns FROM table WHERE conditions') 
>> results[0] 
=> <Task id: 6153, start_time: "2000-01-01 00:00:00", end_time: "2000-01-01 00:00:00", project_id: 6, spent_time: 10.0, user_id: 80, activity_id: 9> 
>> results[0].comment 
=> "test" 
+0

Wow. das war sehr nützlich. Danke vielmals. Eine Sache, die mir aufgefallen ist, dass Rails Feldnamen sensibel berücksichtigt. Die selbe Abfrage wurde in der Datenbank (mysql) ausgeführt, weil dort Feldnamen in mysql standardmäßig nicht beachtet werden. Wie bereits in Ihren Antwort-Ergebnissen [0] erwähnt, arbeitete COMMENT für mich. weil ich in der Abfrage "Kommentar" und nicht "Kommentar" hatte –

Verwandte Themen