虽然一般来说,我喜欢在我的数据库中的区分大小写,有几次我觉得痛苦. user_name和email是我不想担心的情况的一个很好的例子,特别是在搜索时.
在使用以下类似的东西保存之前,可以很容易地将字符串缩小:
before_save做
self.email.downcase!
结束
这样,用户名和电子邮件总是保存为小写.但是find_by_user_name和find_by_email的最佳方式是什么?我当然可以记得总是把我正在传递给这些方法的字符串放在正确的位置 – 但是看起来不是很干燥.
一旦我下了电子邮件,我想到了超越find_by_email并且用超级电话来调用它,但是我没有任何运气想出来.
那么,最好的方法是什么?
PS我不认为这样的相关帖子(how can I write a case-insensitive find_by_email for Rails 3)正在努力解决同样的问题.因为我已经确保所有这些值都更低 – 这是现在正在进行的(可能来自用户输入的形式),我需要下载的自定义sql在这里与“低”对我来说是无用的.
解决方法
其中一个应该是好的:
def self.find_by_lower_email(email) User.find_by_email(email.downcase) end # OR def self.find_by_email(email) User.find(:all,:conditions => ["email = lower(?)",email]) end
更新:
find_by _…函数实际上是不存在的.当您调用其中之一时,ActiveRecord :: Base将使用method_missing方法捕获您的调用,如果名称格式良好(包含列名称等),则会为该类创建适当的find方法.之后它将存在.
如果你有一个find_by_email,它将被默认调用.如果它调用super,那意味着你尝试调用ActiveRecord :: Base.find_by_email,它不存在. missing_method捕获它,并创建(实际覆盖您的)find_by_email实现.这就是为什么不叫超级那里.如果您使用自己的实现来通过电子邮件查找,就像我在第二部分中写的那样,那么它将会很出色地工作.