2011-09-23 33 views
10

Tôi có một mô hình đơn giảnLàm thế nào để làm tham gia vào truy vấn phụ trong AREL trong Rails

class User 
    has_many :logs 


class Logs 

liên quan theo cách thông thường thông qua các logs.user_id chính nước ngoài. Tôi đang cố gắng làm những điều sau đây bằng cách sử dụng Arel và theo Arel doc nó sẽ hoạt động.

u_t = Arel::Table::new :users 
l_t = Arel::Table::new :logs 

counts = l_t. 
    group(l_t[:user_id]). 
    project(
     l_t[:user_id].as("user_id"), 
     l_t[:user_id].count.as("count_all") 
    ) 

l_t.joins(counts).on(l_t[:id].eq(counts[:user_id])) 

Khi tôi làm điều đó tôi nhận được lỗi

TypeError: Cannot visit Arel::SelectManager 

Tuy nhiên tác giả của Arel explicitly suggests rằng Arel có thể làm điều này loại điều.

Vui lòng không viết câu trả lời về cách tôi có thể đạt được cùng một truy vấn với sql thô, một loại truy vấn Arel khác ... Đó là mẫu mà tôi quan tâm không phải là kết quả cụ thể của truy vấn này.

Trả lời

8

Bạn có thể sử dụng join_sources để lấy Arel :: Nodes :: Tham gia từ trường hợp của Arel :: SelectManager, và thông qua đó để tham gia

Sử dụng ví dụ của bạn:

l_t.joins(counts.join_sources).on(l_t[:id].eq(counts[:user_id])) 
+1

'l_t [: id] .eq (đếm [: user_id]) 'hiện công việc này? Ý tôi là, tại sao id của nhật ký phải bằng id của người dùng? –

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