2

포스트 그레스 ENUM 컬럼의 값을 업데이트하려고은 다음과 같은 예외가 발생 'PG :: DatatypeMismatch`을 수득사용 포스트 그레스 ENUM은

class CreateInterestingTables < ActiveRecord::Migration 
    def up 
    execute <<-SQL 
     CREATE TYPE normal_thing AS ENUM ('food', 'water', 'shelter'); 
     CREATE TYPE interesting_thing AS ENUM ('foo', 'bar', 'baz'); 
    SQL 

    create_table :interesting_tables do |t| 
     t.column :normal_column, :normal_thing 
     t.column :interesting_column, :interesting_thing 
    end 
    end 

    def down 
    drop_table :interesting_tables 
    execute 'DROP TYPE normal_thing' 
    execute 'DROP TYPE interesting_thing' 
    end 
end 

답변

3

데이터베이스에서 열의 형식이 올바르지 만 활성 레코드에서는 integer으로 해석됩니다. 당신은 실행을 확인 할 수 있습니다

InterestingTable.columns 
# => [#<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007f7567f82260 
#  @coder=nil, 
#  @default=nil, 
#  @limit=nil, 
#  @name="id", 
#  @null=false, 
#  @precision=nil, 
#  @primary=true, 
#  @scale=nil, 
#  @sql_type="integer", 
#  @type=:integer>, 
#  #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007f7568075690 
#  @coder=nil, 
#  @default=nil, 
#  @limit=nil, 
#  @name="normal_column", 
#  @null=true, 
#  @precision=nil, 
#  @primary=false, 
#  @scale=nil, 
#  @sql_type="normal_thing", 
#  @type=nil>, 
#  #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007f7568075668 
#  @coder=nil, 
#  @default=nil, 
#  @limit=nil, 
#  @name="interesting_column", 
#  @null=true, 
#  @precision=nil, 
#  @primary=false, 
#  @scale=nil, 
#  @sql_type="interesting_thing", 
#  @type=:integer>] 

주 마지막의 그 integer 동안 두 번째 열에 대한 유형, nil 방법. String#to_i은 문자열이 숫자로 시작하지 않으면 0을 반환하므로 0을 할당하려고한다는 오류가 발생합니다.


왜 그렇습니까? 그 이유는 - interesting_thing에는 으로 간주되는 서브 문자열 int이 들어 있습니다. 이것은 레일 4.2까지 수정되지 않은 오랫동안 존재하는 버그 인 것 같습니다. The offending method.


가능한 해결책 :

  • 마이그레이션은 4.2
  • 원숭이 어댑터를 패치 일치 뭔가에 ENUM의 이름을 바꿉니다 레일합니다. quick fix입니다.