- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设 Rails 3 与 MySQL 数据库不区分大小写
故事是什么:
Rails 允许您使用“唯一性”验证器来验证模型的属性。但是根据 Rails 文档,默认比较是区分大小写的。
这意味着在验证时它会执行如下 SQL:
SELECT 1 FROM `Users` WHERE (`Users`.`email` = BINARY 'FOO@email.com') LIMIT 1
对于拥有带 CI 整理的数据库的我来说,这完全是错误的。它会认为'FOO@email.com'有效,即使用户表中已经有另一个用户'foo@email.com'。换句话说,这意味着,如果应用程序的用户尝试使用电子邮件“FOO@email.com”创建一个新用户,这对于 Rails 来说是完全有效的(默认情况下),INSERT 将被发送到数据库。如果您碰巧没有电子邮件的唯一索引,那么您会很高兴 - 行将毫无问题地插入。如果你碰巧有一个唯一索引,那么就会抛出异常。
好的。 Rails 说:由于您的数据库具有不区分大小写的排序规则,因此执行不区分大小写的唯一性验证。这是怎么做到的?它告诉您可以通过在特定属性验证器上设置“:case_sensitive => false”来覆盖默认的唯一性比较敏感度。在验证时,它会创建以下 SQL:
SELECT 1 FROM `Users` WHERE (LOWER(`Users`.`email`) = LOWER('FOO@email.com') LIMIT 1
这是数据库表 Users 上的灾难,您设计为在电子邮件字段上具有唯一索引,因为它不使用索引,所以进行全表扫描。
我现在看到 SQL 中的 LOWER
函数是由 ActiveRecord
的 UniquenessValidator
插入的(文件 uniqueness.rb
,模块 ActiveRecord
,模块 Validations
类 UniquenessValidator
)。这是执行此操作的代码片段:
if value.nil? || (options[:case_sensitive] || !column.text?)
sql = "#{sql_attribute} #{operator}"
else
sql = "LOWER(#{sql_attribute}) = LOWER(?)"
end
所以问题转到 Rails/ActiveRecord 而不是 MySQL Adapter。
问题:有没有办法告诉 Rails 将关于唯一性验证区分大小写的要求传递给 MySQL 适配器,而不是“聪明”地改变查询?或者为了澄清而改写的问题:是否有另一种方法可以对属性实现唯一性验证(请小心......我不是在谈论电子邮件,只是以电子邮件为例)关闭区分大小写并生成将在相应列上使用简单唯一索引的查询?
这两个问题是等价的。我希望现在,我让自己更清楚,以便得到更准确的答案。
最佳答案
验证唯一性而不考虑大小写
如果你想坚持以大写或小写形式存储电子邮件,那么你可以使用以下内容来强制唯一性而不考虑大小写:
validates_uniqueness_of :email, case_sensitive: false
(另见这个问题: Rails "validates_uniqueness_of" Case Sensitivity )
完全删除大小写问题
与其进行不区分大小写的匹配,不如在验证之前将电子邮件小写(因此也是):
before_validation {self.email = email.downcase}
由于大小写与电子邮件无关,这也将简化您所做的一切,并将阻止您将来可能进行的任何比较或数据库搜索
关于mysql - 如何在不区分大小写的情况下指示 Rails 在唯一性验证上生成正确的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713752/
我在理解应该如何在 JWT 中使用 jti 声明时遇到一些问题。据我在其他 SO 问题和在线文档中看到的,想法是它们应该是独一无二的,但在什么范围内是独一无二的?每个站点/应用程序一个 jti?每个
我想知道cookie名称的最大值是多少?每个域和/或路径的 cookie 名称是否唯一? 最佳答案 所有这些信息均在RFC 2965 - HTTP State Management Mechanism
这基本上是问题 here 的扩展. 我正在处理一个旧的 MFC 应用程序,其中的 resource.h 文件似乎已被手动编辑并且变得困惑。我看到那里有冲突的 ID。 我只是想确认我们是否可以拥有两个具
1. codeigniter的上传库的encrypt_name选项检查是唯一的? 我知道overwrite选项很重要。如 overwrite是 TRUE ,它会覆盖,如果是 FALSE ,它将通过在名
我可以确定.Method.MethodHandle.GetFunctionPointer()每个匿名函数都是唯一的吗? 想做 public static T Get(Func getDataCallb
在时态表 (Oracle DBMS) 中强制键唯一性的最佳方法是什么。时态表是一个时间跨度记录所有历史状态的表。 例如,我们有一个这样的 Key --> Value 关联 ... create tab
对于某些测试,我需要生成一个可能很长的非随机整数序列,该序列具有预定义的唯一性。我将唯一性定义为一个 float ,等于“序列中唯一 数的数量”除以“序列总长度”。这个数字应该在(0, 1]半开区间内
我敢肯定这是一个愚蠢的问题,但谷歌搜索让我一无所获。 是否每个设备供应商都构建自己的 Android?更重要的是,每个设备供应商是否使用其(供应商的)自己的系统签名 key 对其构建进行签名,这样我们
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is a GUID unique 100% of the time? 看完Guid上的所有帖子后,我仍然不清
我有用户放置的链接和他们在数据库中将被保存 对于 facebook,url 可能是这样的 www.facebook.com http://facebook.com https://facebook.c
给定以下 key : int key = Guid.NewGuid().GetHashCode(); 这个key是否像Guid的唯一性一样唯一? 最佳答案 pigeonhole principle说不
在 C++11 中,我正在使用这个 typeid(T).name() 用于我自己的哈希计算。我不需要程序运行或编译之间的结果相同。我只需要它对于类型是唯一的。我知道,它可以为不同的类型返回相同的名称,
我有一个关于唯一性验证的问题。 来自:http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness
线程上下文的类加载器有多独特。每次启动线程时都会重置吗? 我们能否始终确保 2 个并行线程永远不会具有相同的上下文类加载器? 我看到像 Axis 这样的一些框架依赖于此来获取和设置运行时设置变量。 最
在 UITableViewCell 中,单元格中有多个 uitextfield 那么如何在 uitextfield 委托(delegate)方法中识别哪个文本字段生成操作而不是标记属性? 最佳答案 你
在 Rails 3.0.12 (Ruby 1.8.7) 中使用 UTF 字符时,我遇到了 Rails 唯一性验证器的问题。 这是我的小测试: 正确: name = "dave" count = Use
我正在编写一个用户系统,用户将在其中使用 Twitter 的 API 登录,然后我将信息连同我让用户输入的一些额外信息一起存储在数据库中。我希望用户能够登录后返回,而不必再次登录。我决定获取有关用户的
OPC UA规范(第3部分:地址空间模型)说 5.2.2 NodeId ... A Server shall persist the NodeId of a Node, that is, it sha
是否可以使用 XML 1.1 模式来验证文档中没有两个元素共享一个 id。例如,附加的 XML 文档应该失败,因为 id 的 0、1 和 3 不是唯一的。
在 SQL Server 中,我创建了一个带有 ID 列的表,我将其设为 IDENTITY COLUMN, EmployeeID int NOT NULL IDENTITY(100,10) PRIMA
我是一名优秀的程序员,十分优秀!