2011-04-04 71 views
28

通過Rails遷移定義固定長度SQL列(例如,CHAR(12))的最佳方式是什麼?Rails:用於創建固定長度char(12)列的遷移

爲什麼這不應該由模型來處理是因爲char()vs varchar()的性能,並且我想避免在數據庫中注入原始SQL。

編輯:我知道:限制修飾符,但是該字段仍然是varchar(這對性能不利)並且不允許最小大小。

+3

請注意,使用'字符( n)'列在許多RDBS中沒有提升性能(例如在Postgres中,參考[他們的文檔](http://www.postgresql.org/docs/8.3/static/datatype-character.html))。更重要的是,'char(n)'不能確保最小長度(太短的字符串將被尾隨空格填充) - 您應該使用CHECK約束。 – skalee 2012-01-16 11:36:54

回答

46

如果Rails不理解列類型,它會通過它直接傳送到數據庫中。所以,如果你想要一個字符,而不是VARCHAR,只需更換:

t.column :token, :string 

有了:

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

當然,這可能會或可能不會讓你的遷移不可移植到另一個數據庫。

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

+0

這會爲軌道4生成另一個列名char(12),不再工作 – JAF 2016-01-15 21:56:27

+0

也適用於當前的Postgres。謝謝。 – 2018-01-22 14:09:14

9

您可以使用限制選項字符串類型的遷移文件是這樣的:

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

這會創建一個VARCHAR – 2017-01-05 16:32:07

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

def self.down 
    remove_column("admin_users", "username") 
end 
+2

我知道:limit修飾符,但是該字段仍然是varchar(這對性能不利),並且不允許最小大小。 – 2011-04-04 09:19:38

+0

查看數據庫映射http://www.dizzy.co.uk/ruby_on_rails/cheatsheets/rails-migrations。正如我所見,數據庫字段類型取決於數據庫服務器的種類。 – demas 2011-04-04 09:24:27

+2

這是最可取的解決方案。 char(n)不確保最小長度(至少不在許多RDBS中),您應該使用CHECK約束。 – skalee 2012-01-16 11:40:18

3

對於數據庫特定的類型,我們現在可以使用:

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 
+0

這是解決方案 – JAF 2016-01-15 21:55:55