2014-06-21 15 views
10

Ai đó có thể giúp tôi tìm ra cách viết SQL sau bằng phương thức Rails (Tôi đang sử dụng Rails 4) Activerecord? Tôi biết bạn có thể làm điều này với find_by_sql nhưng tôi muốn duy trì mối quan hệ hồ sơ hoạt động. Đây là sql cho một db PostgreSQL mà tôi đang cố gắng để tạo ra:Rails Activerecord Relation: sử dụng truy vấn con dưới dạng bảng cho câu lệnh chọn 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 

Đối subquery của tôi, tôi đã như sau (mà tạo ra sql của subquery trên):

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

Nhưng, Tôi không thể tìm ra cách viết một câu lệnh chọn sử dụng @subquery làm bảng cho câu lệnh chọn ngoài.

Trả lời

14

Sử dụng phương thức from() từ giao diện Bản ghi hoạt động.

Ví dụ:

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

Sau đó, sử dụng nó như thế này trong các truy vấn bên ngoài:

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

Cảm ơn! Để tham khảo trong tương lai, tôi đã tìm thấy danh sách các phương thức truy vấn cho đường ray tại: http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from – Vee

Các vấn đề liên quan