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

时间:2014-08-10 11:12:10

标签: mysql ruby-on-rails

快速提问:如何在使用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迁移。

1 个答案:

答案 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。