如何在使用rails创建模型时为列指定排序规则

dan*_*aze 6 mysql ruby-on-rails

快速问题:如何在使用rails创建模型时为特定列指定排序规则?

我没有在rails API文档中找到任何选项,但我认为明确声明某些属性的排序规则非常重要.

假设默认排序规则是utf8_unicode_ci.但是在创建用户模型时,密码字段的归类应该是utf8_bin.

所以,当像这样使用rails时

rails g model Users username:string password:string
Run Code Online (Sandbox Code Playgroud)

您无法指定使用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`)
);
Run Code Online (Sandbox Code Playgroud)

如果您不能通过命令直接执行此操作我不在乎您必须修改该db/timestamp_create_users.rb文件.但重点是能够使用rails迁移.

Ren*_*nra 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   
Run Code Online (Sandbox Code Playgroud)

reversible块仅用于启用回滚,因为rails不知道如何在change_column没有原始值的情况下还原.

然后你可以检查mysql cli上的排序规则:

SHOW TABLE STATUS;
Run Code Online (Sandbox Code Playgroud)

你应该在那里看到你的默认排序规则 - 可能是utf8_unicode_ci.然后做:

SHOW FULL COLUMNS FROM users;
Run Code Online (Sandbox Code Playgroud)

你应该在密码字段看到utf8_bin.