Sql Rails:用于创建固定长度字符(12)列的迁移

Sql Rails:用于创建固定长度字符(12)列的迁移,sql,ruby-on-rails,rails-migrations,Sql,Ruby On Rails,Rails Migrations,通过Rails迁移定义固定长度SQL列(例如CHAR(12))的最佳方法是什么 为什么模型不应该处理这个问题是因为char()和varchar()的性能,我希望避免在数据库中注入原始SQL 编辑:我知道:limit修饰符,但是该字段仍然是varchar(这对性能不利),并且不允许最小大小。您可以在迁移文件中使用string type with limit选项,如下所示: t.string :name, :limit => 12, :null => false 如果Rails不理解列

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

为什么模型不应该处理这个问题是因为char()和varchar()的性能,我希望避免在数据库中注入原始SQL


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

您可以在迁移文件中使用string type with limit选项,如下所示:

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

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

t.column :token, :string
与:

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


(归功于)

对于特定于数据库的类型,我们现在可以使用:

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
class-Foo
我知道:limit修饰符,但是该字段仍然是varchar(这对性能不利),并且不允许最小大小。请参阅“数据库映射”一节。正如我所见,数据库字段类型取决于数据库服务器的类型。这是最可取的解决方案
char(n)
不能确保最小长度(至少在许多RDB中不能),您应该使用CHECK约束。请注意,在许多RDB中使用
char(n)
列不会提高性能(例如在Postgres中,请参阅)。更重要的是,
char(n)
不能确保最小长度(过短的字符串将用尾随空格填充)–您应该改用CHECK约束。这就是解决方案,它为rails 4生成另一个列名char(12),不再适用于当前Postgres。谢谢。这将创建一个VARCHAR
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