36

通过 Rails 迁移定义固定长度的 SQL 列(例如 CHAR(12))的最佳方法是什么?

为什么这不应该由模型处理是因为 char() vs varchar() 的性能,我想避免在数据库中注入原始 SQL。

编辑:我知道 :limit 修饰符,但是该字段仍然是 varchar (这对性能不利)并且不允许最小大小。

4

4 回答 4

54

如果 Rails 不理解列类型,它会将其直接传递给数据库。因此,如果您想要一个 char 而不是 varchar,只需替换:

t.column :token, :string

和:

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

当然,这可能会也可能不会使您的迁移无法移植到另一个数据库。

(归功于http://laurelfan.com/2010/1/26/special-mysql-types-in-rails-migrations

于 2011-05-06T15:01:56.560 回答
28
 def self.up
    add_column("admin_users", "username", :string, :limit => 25)
 end

 def self.down
    remove_column("admin_users", "username")
 end
于 2011-04-04T09:04:09.890 回答
9

您可以在迁移文件中使用带有限制选项的字符串类型,如下所示:

t.string :name, :limit => 12, :null => false
于 2011-04-04T09:03:45.883 回答
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
于 2014-11-20T20:16:42.180 回答