

主題の通り、テーブルを結合して、enumの値で検索したときにstring ->
integerの変換がうまく行われない。to_sqlの結果をみると、nullに変換されてしまうのですが、どこが原因か特定できません。

  * SQLクライアントなど通して、カラムのデータ型間違えていないか確認
  * joinsすると起きてるようにみえる。
  * self.inheritance_column = :_type_disabledは追加してある
  * 結合したときに、他のテーブルにtypeカラムはない

解決方法ご存知であれば教えてほしいです。  
尚、業務コードなので、ぼかしてかいてます。  
（ぼかした結果タイポなどしていたら申し訳ないです。。。）

Rails 6.0.6.1  
Ruby 2.7  
PostgreSQL

ER図

[![画像の説明をここに入力](https://i.stack.imgur.com/LdIBJ.png)](https://i.stack.imgur.com/LdIBJ.png)

[code]

    class Employment
     belongs_to :account
    end
    
    class Account
     has_one :profile
     has_many :employments
    end
    
    class Profile
     has_one :career_verification, -> { where(type: AdminVerification::Type::CAREER) },
              class_name: 'AdminVerification', inverse_of: :profile, dependent: :destroy
    
     has_one :project_verification, -> { where(type: AdminVerification::Type::PROJECT) },
              class_name: 'AdminVerification', inverse_of: :profile, dependent: :destroy
    
     has_many :verifications, dependent: :destroy, class_name: 'AdminVerification'
    end
    
    class AdminVerification
     self.inheritance_column = :_type_disabled
     belongs_to :profile
     enum type: { project: 0, career: 10 }, _suffix: true
    
      module Type
        PROJECT = 'project'
        CAREER = 'career'
      end
    end
    
[/code]

### 試したこと

[code]

    # 今回実行したいクエリ
    # type = NULLで検索されてしまう。
    puts Employment.joins(account: { profile: :verifications }).where(admin_verifications: {type: "career"}).to_sql
     
    SELECT "employments".* FROM "employments" 
    INNER JOIN "accounts" ON "accounts"."id" = "employments"."account_id" 
    INNER JOIN "profiles" ON "profiles"."account_id" = "accounts"."id" 
    INNER JOIN "admin_verifications" ON "admin_verifications"."profile_id" = "profiles"."id" 
    WHERE "admin_verifications"."type" = NULL
    
    # enumのstringがちゃんと変換されているケース
    puts AdminVerification.where(type: "career").to_sql
    SELECT "admin_verifications".* FROM "admin_verifications" WHERE "admin_verifications"."type" = 10
    
    puts Employment.joins(account: { profile: :verifications }).where("admin_verifications.type = ?", "career").to_sql
    SELECT "employments".*
    FROM "employments"
    INNER JOIN "accounts" ON "accounts"."id" = "employments"."account_id"
    INNER JOIN "profiles" ON "profiles"."account_id" = "accounts"."id"
    INNER JOIN "admin_verifications" ON "admin_verifications"."profile_id" = "profiles"."id" WHERE (admin_verifications.type = 'career')
    
[/code]


CC BY-SA 4.0
2023-07-31T06:47:33.463
95810
2023-08-01T01:23:33.463
2023-08-01T01:23:33.463
3060
59291
question
ruby-on-rails ruby
テーブルを複数結合した場合、enumの値で検索したときにstring -> integerがうまく変換されずにnullになる


こちら解決したので、回答として投稿します。  
バージョンを上げたら直るそうです。

[Allow `where` references association names as joined table alias names by
kamipo · Pull Request #40106 ·
rails/rails](https://github.com/rails/rails/pull/40106)


CC BY-SA 4.0
2023-07-31T14:20:26.770
95815
2023-08-01T00:58:06.813
2023-08-01T00:58:06.813
3060
59291
95810
answer