PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Một tình huống trong đó ActiveRecord và SQL không trả lại kết quả giống nhau do OID không xác định được coi là Chuỗi

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 )




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres - Tính tổng dựa trên kết quả tổng của một cột khác

  2. Độ chính xác của Dấu thời gian JOOQ trên truy vấn

  3. Cài đặt PostgreSQL trên Docker

  4. Cách so sánh hai lược đồ trong PostgreSQL

  5. cách tính thời gian giữa hai dấu thời gian (PostgreSQL)