2014-06-21 12 views
10

Czy ktoś może mi pomóc dowiedzieć się, jak napisać poniższy SQL za pomocą Railsów (używam Rails 4) metod Activerecord? Wiem, że możesz to zrobić za pomocą find_by_sql, ale chciałbym zachować aktywną relację rekordów. Oto sql do db PostgreSQL, że staram się tworzyć:Relacje Rails Activerecord: użycie podzapytania jako tabeli dla instrukcji SQL Select

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 

Dla mojego podzapytania, mam następujący (która generuje powyższy SQL podzapytania):

@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") 

Ale Nie mogę wymyślić, jak napisać instrukcję select, która używa @subquery jako tabela dla zewnętrznej instrukcji select.

Odpowiedz

14

Użyj metody from() z interfejsu Active Record.

na przykład:

@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") 

następnie używać go w ten sposób w zapytaniu zewnętrznym:

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

Dzięki! W celu późniejszego wykorzystania, znalazłem listę metod zapytań dla szyn na stronie: http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-od – Vee

Powiązane problemy