2014-06-21 11 views
10

Qualcuno può aiutarmi a capire come scrivere il seguente SQL utilizzando i metodi di Rails (sto usando Rails 4) Activerecord? So che puoi farlo con find_by_sql ma vorrei conservare la relazione record attiva. Ecco l'SQL per un db PostgreSQL che sto cercando di creare:Rails Activerecord Relazione: utilizzo della sottoquery come tabella per un'istruzione SELECT SQL

SELECT * FROM 
(SELECT DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.id, table_b.time 
FROM table_1 
LEFT OUTER JOIN table_b ON table_a.id = table_b.id 
ORDER BY table_a.id, table_b.time asc) AS subquery 
ORDER BY alias_a asc 

Per il mio subquery, ho il seguente (che genera il codice SQL della sottoquery sopra):

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")  
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id") 
@subquery = @subquery.order("table_a.id, table_b.time asc") 

Ma, Non riesco a capire come scrivere un'istruzione select che usa @subquery come tabella per l'istruzione select esterna.

risposta

14

Utilizzare il metodo from() dall'interfaccia Active Record.

Ad esempio:

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")  
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id") 
@subquery = @subquery.order("table_a.id, table_b.time asc") 

Quindi utilizzare in questo modo nella query esterna:

@query = OtherModel.from("(#{@subquery.to_sql}) table_name, other_model_table, etc ...").where(:field => table_name.alias_a) ...etc. 
+0

Grazie! Per riferimento futuro, ho trovato un elenco di metodi di query per i binari all'indirizzo: http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-om – Vee

Problemi correlati