使Rails中的db列不区分大小写的最佳方法是什么?

问题描述 投票:0回答:2

我正在一个RoR项目中,我有一个带有字符串属性的模型,该模型需要完全不区分大小写。我只是想知道什么是最好的方法。

[我见过一些人在模型中添加setter的情况,这些人在将字符串放入数据库之前将其大写,并且在搜索数据库时,有些人使查询不区分大小写。

有没有办法在数据库级别上做到这一点?我正在使用postgres。如果不是,解决此问题的最佳方法是什么?搜索不区分大小写的数据库时,数据库是否会大受打击?从安全角度来看呢?每次检查不区分大小写以防止出现问题的人是否以某种方式创建小写行是否更安全?基本上,什么是最佳做法?

ruby-on-rails postgresql validation activerecord activemodel
2个回答
1
投票

数据库列从不区分大小写。您的互动可能不区分大小写。如您所见,有几种可能的情况和解决方案。

如果该属性仅在某种情况下有意义,但是无论大小写您都希望进行搜索,那么在写入数据库时​​始终将其规范化为大小写并过滤访问它的查询。一个典型的例子是电子邮件地址。您要始终将其存储为小写,并确保以这种方式查询它,从而减少了用户输入的大小写。

反之亦然,如果您要在字段中保存大小写很重要(例如标题或品牌),但要允许不区分大小写的交互,则基本上有两个选项

  1. 添加一个包含属性的单独字段,该属性始终不区分大小写,并像前面的示例一样进行操作
  2. 查询数据库时使用数据库引擎功能,以便在运行时转换值。请记住,这可能会阻止数据库使用索引,因此可能导致性能下降。

0
投票

您可以执行许多选择:

您可以为不区分大小写的数据库设置本地。以Ubunto下的pg为例。这是非常依赖于操作系统且棘手的。例如。 Mac和RHEL pg始终区分大小写,而Ubuntu pg默认情况下不区分大小写。它有希望,但我没有取得太大的成功。语言环境取决于操作系统。 Mysql和SqlServer附带语言环境。灵活性较差,但跨操作系统更一致。

您也可以安装citext扩展名。创建citext而不是varchar的字段。可以肯定的是,现在扩展名已经进入schema.rb了。Model.where(:field => "AnY cAsE")

即使没有通配符(ILIKE),也使用%也会执行不区分大小写的搜索。Model.where(Model.arel_table[:field].match("AnY cAsE"))

lower(field)上创建索引,并使用该索引搜索表。 LIKEILIKE具有非常不同的性能特征,并且往往要好得多。Model.where(Model.arel_table[:field].lower.match("AnY cAsE".downcase, nil, true))

将所有值存储为小写。可以在before_validation回调中填充的单独字段中。Model.where(:field_lower => "AnY cAsE".downcase)

祝你好运您可能已经解决了此问题,但以为我会分享我们在公司中考虑的内容。

© www.soinside.com 2019 - 2024. All rights reserved.