Bạn gặp sự cố này vì ActiveRecord không thể nhận dạng hàng này là hàng từ bảng tài khoản của bạn. AR không phân tích cú pháp sql của bạn và không chắc chắn phải làm gì với nhóm ẩn danh.
Nếu bạn sử dụng find_by_sql
các thuộc tính đã chọn của bạn không được ánh xạ đúng với mô hình của bạn nhưng vẫn có thể truy cập được, vì vậy hãy thử:
result.id
result.email
Nhưng bạn cũng có hai cách để khắc phục điều đó.
Đầu tiên (đó là giải pháp rất khó nhưng dễ dàng), hãy chuyển đổi sql của bạn thành Arel
, vaild đó cho phạm vi:
scope :unverified_with_no_associations, -> {
send(:default_scoped).from(Arel.sql("(SELECT * FROM accounts WHERE level = 0 AND id NOT IN
(SELECT DISTINCT(account_id) FROM verifications) AND id NOT IN
(SELECT DISTINCT(account_id) FROM positions) AND id NOT IN
(SELECT DISTINCT(account_id) FROM edits) AND id NOT IN
(SELECT DISTINCT(account_id) FROM posts) AND id NOT IN
(SELECT DISTINCT(account_id) FROM reviews) AND id NOT IN
(SELECT DISTINCT(sender_id) FROM kudos) AND id NOT IN
(SELECT DISTINCT(account_id) FROM stacks WHERE account_id IS NOT NULL))
AS accounts"))
... và gọi phương thức riêng biệt AR:
Account.unverified_with_no_associations.select(:id, :email).distinct
Thứ hai (đó là giải pháp tốt hơn nhiều):
Không sử dụng sql trực tiếp. Viết lại phạm vi của bạn bằng Arel
( https://github.com/rails/arel
) hoặc với squeel
( https://github.com/activerecord-hackery/squeel
)