당신은 그것을 할 수있는 USING clause of ALTER TABLE :
옵션 USING
절은 오래된에서 새 열 값을 계산하는 방법을 지정합니다; 생략하면 기본 변환은 이전 데이터 유형에서 new 로의 배역 캐스팅과 동일합니다. 간단한 SQL 유형 캐스트가 문자열 'true'
및 'false'
당신을 떠날 것이다
그래서 당신은 사용을 추가 할 수 없습니다. 나는 AR을 무시하고 손으로 그것을 할 것 :
이
connection.execute(%q{
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
})
당신을위한 중요한 부분은 마지막에 using case ...
부분입니다. 당신은 옳은 일을에 AR을 속여 일반적인 AR 틱 change_column
물건과 함께 그것을 사용할 수 있습니다 : 나는 열 유형으로 text
을 사용하고
class ChangeColumnTypeInUsers < ActiveRecord::Migration
def up
change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
end
def down
change_column :users, :active, "boolean using active = 'active'"
end
end
참고. 레일스는 :string
에 제한이 없다고 말할 때 데이터베이스 내부에 varchar(255)
을 사용합니다. PostgreSQL에서는 모든 문자열 유형 pretty much the same internally에 대한 저장소를 처리하기 때문에 무의미하며 char(n)
과 varchar(n)
의 길이 제한은 실제로 text
보다 비쌉니다. 그렇다면 :string
은 PostgreSQL에서 의미가 있습니다. 특정 :limit
을 포함해야하는 경우입니다 (길이가 CHECK
인 text
열이 더 적합 할 수 있지만 AR은 너무 바보이어서 CHECK
과 같은 고급 항목에 대해 알 수 없습니다) 제약 조건).
나는 당신의 AR-ish 솔루션을 마이그레이션으로 돌렸고, 올바른 일을했다. 철저한 설명에 감사드립니다! – MicFin
당신이 sqlite에서 이것을 실행하면 어떤 일이 일어날 지 궁금합니다. Postgres를 위해 매우 우아하게 보입니다! 좋은 물건 – DevDude
@DevDude : 아마도 넘어져서 불이 났을 것입니다. 그러나 SQLite로 개발하고 PostgreSQL에 배치하면 고통과 고통과 같은 가치를 얻을 수 있습니다. ActiveRecord가 데이터베이스 이식성을 제공 할 것으로 기대하고 있다면 슬프게도 오인됩니다. 그런 식으로 작동하지 않습니다. –