通過Rails遷移定義固定長度SQL列(例如,CHAR(12))的最佳方式是什麼?Rails:用於創建固定長度char(12)列的遷移
爲什麼這不應該由模型來處理是因爲char()vs varchar()的性能,並且我想避免在數據庫中注入原始SQL。
編輯:我知道:限制修飾符,但是該字段仍然是varchar(這對性能不利)並且不允許最小大小。
通過Rails遷移定義固定長度SQL列(例如,CHAR(12))的最佳方式是什麼?Rails:用於創建固定長度char(12)列的遷移
爲什麼這不應該由模型來處理是因爲char()vs varchar()的性能,並且我想避免在數據庫中注入原始SQL。
編輯:我知道:限制修飾符,但是該字段仍然是varchar(這對性能不利)並且不允許最小大小。
如果Rails不理解列類型,它會通過它直接傳送到數據庫中。所以,如果你想要一個字符,而不是VARCHAR,只需更換:
t.column :token, :string
有了:
t.column :token, "char(12)"
當然,這可能會或可能不會讓你的遷移不可移植到另一個數據庫。
(信貸http://laurelfan.com/2010/1/26/special-mysql-types-in-rails-migrations)
這會爲軌道4生成另一個列名char(12),不再工作 – JAF 2016-01-15 21:56:27
也適用於當前的Postgres。謝謝。 – 2018-01-22 14:09:14
您可以使用限制選項字符串類型的遷移文件是這樣的:
t.string :name, :limit => 12, :null => false
這會創建一個VARCHAR – 2017-01-05 16:32:07
def self.up
add_column("admin_users", "username", :string, :limit => 25)
end
def self.down
remove_column("admin_users", "username")
end
對於數據庫特定的類型,我們現在可以使用:
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
這是解決方案 – JAF 2016-01-15 21:55:55
請注意,使用'字符( n)'列在許多RDBS中沒有提升性能(例如在Postgres中,參考[他們的文檔](http://www.postgresql.org/docs/8.3/static/datatype-character.html))。更重要的是,'char(n)'不能確保最小長度(太短的字符串將被尾隨空格填充) - 您應該使用CHECK約束。 – skalee 2012-01-16 11:36:54