2013-04-24 25 views
5

tôi có thể nhận bộ sưu tập của các tài khoản có nhiều hơn một người sử dụng:ray 3 nhận được số lượng các bản ghi rằng có nhiều hơn một hồ sơ liên kết (has_many)

Account.group('accounts.id HAVING count(users.id) > 1').joins(:users) 

Nhưng, ngay sau khi tôi gọi. đếm trên đối tượng đó, tôi nhận được một vụ nổ lớn:

(0.3ms) CHỌN COUNT (*) AS count_all, accounts.id HAVING count (users.id)> 1 AS accounts_id_having_count_users_id_1 FROM "accounts" INNER JOIN "users" ON "người dùng". "Account_id" = "tài khoản". "Id" GROUP BY accounts.id HAVING count (users.id)> 1 ActiveRecord :: StatementInvalid: PG :: Lỗi: LRI: lỗi cú pháp tại hoặc gần "AS" Dòng 1: ... unt_all, accounts.id CÓ count (users.id)> 1 AS tài khoản ...

Dường như trong postgres, truy vấn thực tế tôi muốn là:

select count(*) from (SELECT accounts.id FROM "accounts" INNER JOIN "users" ON "users"."account_id" = "accounts"."id" GROUP BY accounts.id HAVING count(users.id) > 1) as a; 

Làm cách nào để nhận được activerecord để tạo truy vấn này (hoặc so sánh)?

Trả lời

7

kỷ lục hoạt động hỗ trợ 'có' như một phương pháp. Vì vậy, bạn có thể làm truy vấn của bạn theo cách này:

0

Tại sao bạn không thử loại này từ mô hình dùng, nơi bạn group_by các ACCOUNT_ID từ mô hình người dùng

User.count(:group => :account_id) này có thể trả về một băm thấy {: ACCOUNT_ID => COUNT_OF_USERS} Ví dụ, {1 => 3, 2 => 5, 3 => 2}

Bây giờ chọn của ACCOUNT_ID có sử dụng đếm lớn hơn 1.

+1

nhưng điều đó đòi hỏi iterating ruby ​​qua việc thu thập và làm một so sánh trên mỗi value-- và sau đó gọi số trên đó. Tôi đang tìm kiếm một cách để làm cho cơ sở dữ liệu làm đếm. – patrick

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