【问题标题】:Autocomplete and how to let it understand lowercase and uppercase自动完成以及如何让它理解小写和大写
【发布时间】:2012-01-26 04:07:42
【问题描述】:

我在 Ruby 中有一个用于在美国创建城市的种子文件的数据库,即:

City.create(:name => "Sausalito,CA", :state => "CA")

但是,在测试自动完成时,如果我的格式正确,数据库只会识别每个预加载的位置。

因此它会将“Sausolito, CA”视为输入,但不会将“sausolito, ca”视为输入。

这是对数据库的简单修复还是搜索框问题?

谢谢!

编辑:这是电话:

    class CitiesController < ApplicationController
  def autocomplete

    render :json => City.autocomplete_name(params[:term]).collect{ |city| {:value => city.id, :label => "#{city.name}"} }


  end

end

交流:

class City < ActiveRecord::Base

  attr_accessible :name, :state
has_many :searches

scope :autocomplete_name, lambda {|name|

    where("cities.name LIKE ?", "#{name}%")
 }

end

【问题讨论】:

  • jQueryUI - 这就是你的意思吗?
  • 不,现在您是从数据库中加载值吗?它们是预先加载到页面中的,还是在您开始输入时自动完成调用控制器上的方法?我会发布更多关于您的自动完成设置的代码。
  • 当用户输入第一个字母时,控制器上会调用一个方法……让我在原始帖子中添加一些代码。
  • 您更新的帖子只显示了迁移,而不是实际的控制器代码...
  • 对不起,脑子放屁 - 这是控制器

标签: html ruby-on-rails ruby database sqlite


【解决方案1】:

您正在搜索什么数据库?对于 MySQL,您可以使用 Order By 子句来实现不区分大小写 - 见下文....

我还发现奇怪的是 STRCMP() 区分大小写,但 ORDER BY 不区分大小写。

您可以在此处找到更多信息。甚至我想知道在某些情况下,MySQL 选择不区分大小写,但我并没有真正花时间弄清楚为什么它不一致,今天我学会了!

http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

最好的方法是将所有这些记录加载到内存中,并存储这些字符串的小写版本。您的性能会比使用数据库自​​动完成功能要好得多。

【讨论】:

  • 好的。他不应该将结果缓存在内存中吗?除非流量非常有限,否则我无法想象数据库(sqlite 也是如此)能够支持所有自动完成的 ajax 调用!
  • SQLite 仅用于本地测试 :)
【解决方案2】:

如果您的数据库使用 SELECT * FROM xyz WHERE name LIKE '$typed%' 类型的查询加载查询,您可以使用 SELECT * FROM xyz WHERE LOWER(name) LIKE LOWER("$typed%")

【讨论】:

  • 并且不要将变量嵌入到查询中。这是被 SQL 注入攻击的好方法。
  • 假设上面的行是$typed = mysql_real_escape_string($typed);, mmk?
  • SQLite 似乎也支持lower() 函数。 where("lower(cities.name) LIKE lower(?)", "#{name}%")。净化输入是一个独立于语言的概念。
猜你喜欢
  • 2013-06-27
  • 2013-04-08
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2012-01-29
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多