Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails mongoid中不区分大小写的单词搜索_Ruby On Rails_Indexing_Mongoid_Case Insensitive - Fatal编程技术网

Ruby on rails mongoid中不区分大小写的单词搜索

Ruby on rails mongoid中不区分大小写的单词搜索,ruby-on-rails,indexing,mongoid,case-insensitive,Ruby On Rails,Indexing,Mongoid,Case Insensitive,有没有办法在mongoid中为不区分大小写的搜索设置属性 假设有人有一个用户名:iamgreet,我希望使用他们唯一的用户名查找用户数据,而不必将其销毁并更改为iamgreet 谢谢在进行比较时,为什么不直接关闭一个用户.login.downcase(或任何您的模型/属性组合)?这将使DB中的大小写保持原样,但将字段降格仅用于比较。实际上,您可以不区分大小写进行搜索。但是你必须用正则表达式搜索! 下面是一个我如何在中使用它的示例 使用“/”可以开始和结束正则表达式。正则表达式后面的“i”表示不区

有没有办法在mongoid中为不区分大小写的搜索设置属性

假设有人有一个用户名:iamgreet,我希望使用他们唯一的用户名查找用户数据,而不必将其销毁并更改为iamgreet


谢谢

在进行比较时,为什么不直接关闭一个
用户.login.downcase
(或任何您的模型/属性组合)?这将使DB中的大小写保持原样,但将字段降格仅用于比较。

实际上,您可以不区分大小写进行搜索。但是你必须用正则表达式搜索! 下面是一个我如何在中使用它的示例


使用“/”可以开始和结束正则表达式。正则表达式后面的“i”表示不区分大小写。“^”表示元素必须以搜索字符串开头,“$”表示元素必须以搜索字符串结尾。如果您正在寻找精确匹配,这一点很重要。

您甚至可以尝试以下方法:

User.where(username: /#{username}/i).first

如果您使用的是rails或mongoid,您可以尝试ff:


@user=user.where({:username=>/.*{name}.*/i})

如果应用程序不需要将用户输入存储为区分大小写,只需在输入的过程中将输入转换为大写或小写即可。例如

username = params[:username].to_s.downcase
否则,如果性能是一个问题(不区分大小写的正则表达式不能利用索引),正确的方法是为username存储一个备份字段

field :username_downcase
然后执行查询:

User.where(username_downcase: params[:username].to_s.downcase)

仅供参考:如果正则表达式包含用户输入,您可能需要对其进行清理:
/^{Regexp.escape(email)}$/i
user=where(email:/^{email}$/i)。首先
/i
是技巧中的
用户。where(name:/.*{term\u to\u search}.*/i)。to\u a
忽略给定字符串中的大小写(1)不区分大小写的相等(2)即(AFAIK)不会使用索引检查集合,因此可能非常昂贵。是的。这比默认查询慢50%。但它会检查不区分大小写的相等。不,它不会检查相等。你的正则表达式没有锚。事实上Mongoid确实在正则表达式查询中使用索引,但它是有限的。要充分利用带有正则表达式搜索的索引,请将正则表达式从字符串的开头开始,如:
User.where(username://^{username}/i)。首先
(注意
^
User.where(username_downcase: params[:username].to_s.downcase)