【问题标题】:Ruby on Rails - Implementing Simple Search with scopesRuby on Rails - 使用范围实现简单搜索
【发布时间】:2014-06-05 17:06:42
【问题描述】:

我关注了 Railscasts #37,非常有趣。我试图将其应用于已经暗示范围和分页的搜索。但它失败了。作为 Rails 的新手,我想知道是否存在更好的解决方案。

这是我原来的控制器,它可以工作:

def index
  @business_rules = BusinessRule.pgnd(current_playground).order("hierarchy ASC").paginate(page: params[:page], :per_page => paginate_lines)

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @business_rules }
  end
end

但尝试添加 RailsCast 中定义的搜索功能失败:

@business_rules = BusinessRule.pgnd(current_playground).search(params[:search]).order("hierarchy ASC").paginate(page: params[:page], :per_page => paginate_lines)

错误信息是:undefined method order for #<Array:0x007fbf8cc62ca0>

【问题讨论】:

  • 我还没有看到有问题的 RailsCast,但您的 search 方法似乎返回了 Array。为了使订单或分页起作用,您需要它返回 ActiveRecord::RelationActiveRecord::CollectionProxy 类型的对象。

标签: ruby-on-rails named-scope


【解决方案1】:

您的搜索功能是否像 railscast 中的那样?

def self.search(search)
  if search
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
  else
    find(:all)
  end
end

如果是这样,我猜你会返回一组结果,这些结果不能与其他查询方法链接。

因此,当您使用查询方法(where、order、limit 等)时,它会返回一个 ActiveRelation 对象,它基本上是您最终结果集的代理。在您尝试通过调用 .all、.first、.each 之类的方法来使用结果集之前,它实际上不会影响您的数据库。

你可以这样写你的搜索方法:

def self.search(search)
  if search
    where('name LIKE ?', "%#{search}%")
  end
end

因此,如果存在搜索,您会将 AR 对象的范围缩小到匹配的结果。否则,您不会,这与返回所有内容的结果相同。然后你仍然可以对这些结果进行排序、限制、分页等等。

【讨论】:

  • 您好 DVG 以获得详细的解释。我实际上没有更多错误,但索引页面现在是空的(没有记录),并且表单没有显示!与 will_paginate gem 不兼容吗?谢谢你的帮助。弗雷德
  • 我没想到会这样,但听起来您还有其他问题。你有任何错误吗?你有测试吗?
  • 其实我注意到 RailsCast 中 form_tag 语句以
【解决方案2】:

在控制器中创建的搜索功能的最终脚本是:

def self.search(search)
  if not search.empty?
    where('name like ?', "%#{search}%")
  else
    where('1=1')
  end
end

那么就可以像这样缓存查询方法:

    @business_rules=BusinessRule.pgnd(current_playground).search(params[:search]).limit(10)

更多解释请参考 RailsCast #37,注意插入 from_tag 的语法是

感谢大家的帮助,

最好的问候,

弗雷德

【讨论】:

    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 2018-09-04
    • 2017-03-24
    • 2012-06-08
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多