web-dev-qa-db-ja.com

Rails:固定長char(12)列を作成するための移行

Rails移行を通じて固定長SQL列(たとえば、CHAR(12))を定義する最良の方法は何ですか?

これがモデルで処理されるべきではない理由は、char()とvarchar()のパフォーマンスが原因であり、データベースに生のSQLを挿入することは避けたいです。

編集:私は:limit修飾子を知っていますが、フィールドはまだvarchar(パフォーマンスに悪い)であり、最小サイズを許可していません。

33
manu_v

Railsが列のタイプを認識しない場合、それはデータベースに直接渡されます。したがって、varcharではなくcharが必要な場合は、次のように置き換えます。

t.column :token, :string

と:

t.column :token, "char(12)"

もちろん、これにより、移行が別のデータベースに移植できなくなる場合があります。

(クレジット http://laurelfan.com/2010/1/26/special-mysql-types-in-Rails-migrations

49
KenB
 def self.up
    add_column("admin_users", "username", :string, :limit => 25)
 end

 def self.down
    remove_column("admin_users", "username")
 end
26
demas

次のように、移行ファイルで制限オプション付きの文字列型を使用できます。

t.string :name, :limit => 12, :null => false
8
Ashish

データベース固有のタイプの場合、次を使用できます。

t.column(:column_name, 'char(12)')

そして完全な例として:

class Foo < ActiveRecord::Migration
  def change
     create_table :foo do |t|
       t.column(:column_name, 'custom_type')

       t.timestamps
     end
  end
end
6
meoww-