快速提问:如何在使用rails创建模型时为特定列指定排序规则?
我没有在rails API文档中找到任何选项,但我认为明确声明某些属性的排序规则非常重要。
假设默认排序规则为utf8_unicode_ci
。但是在创建用户模型时,密码字段的排序规则应为utf8_bin
。
所以,当使用这样的轨道时
rails g model Users username:string password:string
您无法指定使用utf8_bin
归类的密码。
有什么办法吗?
修改 生成的SQL应该是这样的:
CREATE TABLE `user` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Unique ID',
`username` VARCHAR(32) NOT NULL COMMENT 'Nick/username',
`password` VARCHAR(32) COLLATE utf8mb4_bin COMMENT 'Encoded password',
PRIMARY KEY(`id`),
INDEX(`username`)
);
如果您不能通过命令直接执行此操作,我不在乎您必须修改db/timestamp_create_users.rb
文件。但重点是能够使用rails迁移。
答案 0 :(得分:6)
可悲的是,似乎rails没有提供任何高级方法来设置列级排序规则,所以你必须至少回退到SQL。以下是我的表现方式:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :password
end
reversible do |dir|
dir.up {
change_column :users, :password, "VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin"
}
end
end
end
reversible
块只是为了启用回滚,因为rails不知道如何在没有原始值的情况下还原change_column
。
然后你可以用:
检查mysql cli上的排序规则SHOW TABLE STATUS;
你应该在那里看到你的默认排序规则 - 可能是utf8_unicode_ci。然后做:
SHOW FULL COLUMNS FROM users;
你应该在密码字段看到utf8_bin。