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

man*_*u_v 31 sql ruby-on-rails rails-migrations

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

为什么这不应该由模型处理是因为CHAR()与VARCHAR()的表现,我想,以避免在数据库中注入原始的SQL.

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

Ken*_*enB 49

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

t.column :token, :string
Run Code Online (Sandbox Code Playgroud)

附:

t.column :token, "char(12)"
Run Code Online (Sandbox Code Playgroud)

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

(信用到http://laurelfan.com/2010/1/26/special-mysql-types-in-rails-migrations)


dem*_*mas 26

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

 def self.down
    remove_column("admin_users", "username")
 end
Run Code Online (Sandbox Code Playgroud)

  • 我知道:limit修饰符,但是字段仍然是varchar(这对性能不利)并且不允许最小大小. (2认同)
  • 这是最明智的解决方案.`char(n)`确实*不*确保最小长度(至少在许多RDBS中没有),你应该使用CHECK约束. (2认同)

Ash*_*ish 8

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

t.string :name, :limit => 12, :null => false
Run Code Online (Sandbox Code Playgroud)

  • 这将创建一个 VARCHAR (2认同)

meo*_*ww- 6

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

t.column(:column_name, 'char(12)')
Run Code Online (Sandbox Code Playgroud)

并举一个完整的例子:

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

       t.timestamps
     end
  end
end
Run Code Online (Sandbox Code Playgroud)