通过Rails迁移定义固定长度SQL列(例如CHAR(12))的最佳方法是什么?
为什么不应该由模型处理这是因为char()vs varchar()的性能,并且我想避免在数据库中注入原始SQL。
编辑:我知道:limit修饰符,但是该字段仍然是varchar(这对性能不利)并且不允许最小大小。
答案 0 :(得分:49)
如果Rails不理解列类型,它会直接将其传递给数据库。因此,如果您想要char而不是varchar,只需替换:
t.column :token, :string
使用:
t.column :token, "char(12)"
当然,这可能会也可能不会使您的迁移不可移植到另一个数据库。
(归功于http://laurelfan.com/2010/1/26/special-mysql-types-in-rails-migrations)
答案 1 :(得分:26)
def self.up
add_column("admin_users", "username", :string, :limit => 25)
end
def self.down
remove_column("admin_users", "username")
end
答案 2 :(得分:8)
您可以在迁移文件中使用字符串类型和限制选项,如下所示:
t.string :name, :limit => 12, :null => false
答案 3 :(得分:6)
对于特定于数据库的类型,我们现在可以使用:
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