sql >> データベース >  >> RDS >> PostgreSQL

不明なOIDが文字列として扱われるため、ActiveRecordとSQLが同じ結果を返さない状況

    ActiveRecordがこの行をアカウントテーブルの行として認識できないため、この問題が発生しました。 ARがSQLを解析しておらず、匿名のコルテージをどう処理するかがわかりません。

    find_by_sqlを使用する場合 選択した属性がモデルに適切にマッピングされていないが、引き続きアクセスできるため、次のことを試してください。

    result.id
    result.email
    

    ただし、これを修正する方法は2つあります。

    最初 (これは非常にハックですが簡単な解決策です)、SQLをArelに変換します 、スコープに役立ちました:

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

    ...そしてARの個別のメソッドを呼び出します:

    Account.unverified_with_no_associations.select(:id, :email).distinct
    

    2番目 (それははるかに優れた解決策です):

    SQLを直接使用しないでください。 Arelでスコープを書き直します ( https://github.com/rails/arel )またはsqueel https://github.com/activerecord-hackery/squeel




    1. PostgreSQLのビルドシステムの作り方

    2. マルチスレッドを使用してMySQLDBに接続します

    3. SQLでゼロ除算を処理する方法

    4. Apache NiFi