【问题标题】:How to specify a collation for a column when creating a model with rails使用rails创建模型时如何为列指定排序规则
【发布时间】:2014-08-10 11:12:10
【问题描述】:

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

【问题讨论】:

  • 也许这对你有帮助? stackoverflow.com/questions/7907210/…
  • 没有。我的数据库设置为使用 utf8_unicode_ci 所以这是默认值,但问题是我想设置 some 表的 some 列以使用不同的排序规则。 (另外,mysql2 gem 与 utf8mb4 存在问题,但这是另一回事)
  • 检查该问题的第一个答案。我认为这是你的情况。
  • 嗨!不,正如我之前告诉你的那样,情况并非如此,因为这个问题是针对整个数据库的。我的意思是,您告诉我在 my.cfg 中设置数据库的配置,我希望其中一列的排序规则与其他列不同。我不知道您是否阅读了问题中的 SQL 示例,但这不是该答案所做的;)
  • 嗯,我认为 rails 会有类似的方式在列级别设置排序规则,对此感到抱歉。请参阅我的答案。

标签: mysql ruby-on-rails


【解决方案1】:

遗憾的是,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。

【讨论】:

  • 哇,这就是 Rails 的一大失败。并添加了 mysql2 gem 由于错误而无法与 utf8_mb4 一起使用的东西,我想我会手动管理我的 SQL 代码......所以我可以有更多的控制权,事情会正常工作lol
  • 您能描述一下您认为标准 utf8_unicode_ci 排序规则可能出现的问题吗?但是,是的,ActiveRecord 似乎应该有一个高级工具,用于在列级别进行排序操作。我认为所有主要的 SQL 数据库都支持,所以移植性应该没有问题。
猜你喜欢
  • 2018-02-21
  • 1970-01-01
  • 2019-01-18
  • 2016-04-04
  • 1970-01-01
  • 2011-05-17
  • 2013-09-26
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多