【问题标题】:Rails Search 3.2 Returns all instead of specific QueryRails Search 3.2 返回全部而不是特定查询
【发布时间】:2013-12-14 23:02:51
【问题描述】:

我在我的 Rails 应用程序中安装了一个简单的搜索方法,我想在另一个控制器视图中从 ajax 调用它。

现在看起来像这样:

class CensusController < ApplicationController

def search
  @census = Census.where("'NBRHD_NAME' like ?", "%#{params[:search]}%")

  render :json => @census.to_json
end

end

在我的另一个视图/控制器中

 google.maps.event.addListener(kmlLayer, 'click', function(kmlEvent) {
        var text = kmlEvent.featureData.name;
        var offset = kmlEvent.latLng;
        showInInfoWindow(text, offset);
        map.panTo(kmlEvent.latLng);
        map.setZoom(13);
        //console.log(kmlEvent);
        showInContentDiv(text);
    });

    function showInInfoWindow(text, offset) {
        var content = "<div>" + text + "</div>";
        var infoWindow = new google.maps.InfoWindow({
            content: content,
            position: offset
        });
        infoWindow.open(map);

    }

    function showInContentDiv(neighborName) {
        var query = neighborName;
        var url = "census/search?query=" + query;

        $.getJSON(url, function(data) {
            console.log(url);

            var neigh = data;

            for (var i in neigh.object)
            {
                console.log(neigh);
            }
        });

我只想返回邻居名称并与我的数据库中的名称匹配,而不是所有数据库名称都以 JSON 格式返回。是不是我做错了什么?

我再次使用 MySQL2 gem 运行 Rails 3.2

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 search rails-activerecord


    【解决方案1】:

    SQL 对字符串文字使用单引号,所以这个查询:

    @census = Census.where("'NBRHD_NAME' like ?", "%#{params[:search]}%")
    

    实际上是在询问字符串文字'NBRHD_NAME' 包含params[:search] 的所有行。大概你想查看 column NBRHD_NAME 而不是 string 'NBRHD_NAME' 所以你应该说:

    @census = Census.where("`NBRHD_NAME` like ?", "%#{params[:search]}%")
    

    @census = Census.where("NBRHD_NAME like ?", "%#{params[:search]}%")
    

    AFAIK,MySQL 对列的大小写敏感度取决于配置,因此如果您正在使用真正以大写创建的列名,则应使用反引号版本以确保安全。请注意,SQL 标识符的反引号是 MySQL 主义,标准 SQL 使用双引号 ("NBRHD_NAME") 来实现此目的,而 SQL Server 使用方括号 ([NBRHD_NAME])。


    我刚刚在你的 JavaScript 中注意到了这一点:

    var url = "census/search?query=" + query;
    

    这表明params[:query] 包含您要查找的内容,但您的控制器正在查看params[:search]。结果是您的 SQL 显示 like '%%'。所以修正你的引用,然后在params 中查看正确的内容:

    @census = Census.where("`NBRHD_NAME` like ?", "%#{params[:query]}%")
    

    【讨论】:

    • 我尝试同时使用这两个选项,但 rails 仍然坚持返回所有结果,同时使用反引号且没有刻度
    • params[:search]NBRHD_NAME 中的哪些值与您认为不应该匹配?
    • 问题在于它似乎根本不匹配值,只会返回数据库中的所有结果。
    • 再次:params[:search] 匹配所有内容时是什么?哪些NBRHD_NAME 值与您认为不应该匹配? params[:search] 可能是空的吗?鉴于您以?query 发送查询,我怀疑params[:search] 中没有任何内容...
    • 我正在做的是发送一个 ajax 请求调用:'census/search?query=_SearchString_' 并且在我的返回响应中我得到了所有结果。我不知道我的params[:search] 是否为空白,这就是我想要弄清楚的
    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多