【发布时间】:2011-09-17 16:11:14
【问题描述】:
有没有办法在 mongoid 中为不区分大小写的搜索设置属性?
假设某人有一个用户名:IAmGreat,我想使用他们唯一的用户名查找用户数据,而不是将其删除并将其更改为 iamgreat。
谢谢
【问题讨论】:
标签: ruby-on-rails indexing mongoid case-insensitive
有没有办法在 mongoid 中为不区分大小写的搜索设置属性?
假设某人有一个用户名:IAmGreat,我想使用他们唯一的用户名查找用户数据,而不是将其删除并将其更改为 iamgreat。
谢谢
【问题讨论】:
标签: ruby-on-rails indexing mongoid case-insensitive
其实你可以不区分大小写搜索。但是您必须使用正则表达式进行搜索! 这是我在http://www.VersionEye.com中使用它的一个例子@
User.first(conditions: {email: /^#{email}$/i})
使用“/”开始和结束正则表达式。正则表达式后的“i”表示不区分大小写。 “^”表示元素必须以搜索字符串开头,“$”表示元素必须以搜索字符串结尾。如果您正在寻找精确匹配,这一点很重要。
【讨论】:
/^#{Regexp.escape(email)}$/i
/i 是技巧User.where(name: /.*#{term_to_search}.*/i).to_a 忽略给定字符串中的大小写
您甚至可以尝试以下方法:
User.where(username: /#{username}/i).first
【讨论】:
User.where(username: /^#{username}/i).first(注意^)
如果你使用的是 rails 或 mongoid,你可以试试 ff:
@user = User.where({:username => /.*#{name}.*/i })
【讨论】:
在进行比较时,为什么不直接删除User.login.downcase(或任何您的模型/属性组合)?这将使数据库中的大写保持原样,但将字段小写仅用于比较。
【讨论】:
如果您的应用程序不需要将用户输入存储为区分大小写,只需在输入时将输入转换为大写或小写即可。示例,
username = params[:username].to_s.downcase
否则,如果性能对您来说是个问题(不区分大小写的正则表达式无法利用索引),正确的解决方法是为用户名存储备份字段
field :username_downcase
然后进行查询:
User.where(username_downcase: params[:username].to_s.downcase)
【讨论】: