【问题标题】:Search on multiple keywords in a single search text field (RAILS)在单个搜索文本字段 (RAILS) 中搜索多个关键字
【发布时间】:2011-09-14 07:24:11
【问题描述】:

我还是个新手,在 Rails 中搜索数据库。我有一个模型和数据库,在“名称”属性下有一个名称列表。我希望能够将搜索关键字输入到单个搜索字段中,并且此输入可以是一个词或两个词或更多,具体取决于用户想要的结果的具体程度。

现在,我正在使用如下所示的丑陋的东西,它最多可以搜索 3 个搜索词。有没有办法让“search_length”关键字动态化? find 方法显然是重复的,但我不确定如何自动化它,也没有在网上其他地方找到任何有用的建议。

def self.search(search)

  if search
    search_length = search.split.length
    find(:all, :conditions => ['name LIKE ? AND name LIKE ? AND name LIKE ?', 
    "%#{search.split[0]}%", "%#{search.split[1]}%", 
    "%#{search.split[search_length1]}%"])
  else
    find(:all)
  end
end

除此之外,到目前为止,我很喜欢 Rails。

非常感谢, 列弗

【问题讨论】:

    标签: ruby-on-rails-3 search


    【解决方案1】:

    如果您用另一个 % 符号关闭 name 变量,来自 Łukasz Śliwa 的代码效果很好。

    上面的完整代码对我有用。很棒的帖子。

    def self.search(search)
    
      if search
        search_length = search.split.length
        find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" })
      else
        find(:all)
      end
    
    end
    

    【讨论】:

    • 完美运行。谢谢楼主!
    【解决方案2】:

    使用这样的东西:

    find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}" })
    

    我看起来很奇怪,但首先生成 search_length 乘以字符串 'name LIKE ?':

     ['name LIKE ?'] * search_length
    

    那么你有一些带有一些键的数组,所以让我们用'AND'来连接它们:

     ["name LIKE ? ", "name LIKE ? ", "name LIKE ? "].join(' AND ')
    

    最后与另一个数组合并。

    【讨论】:

    • 谢谢,我会试试看的。
    • 我想我在第一部分中创建了正确数量的“name like ?”加入。最后一部分仍然很可疑,我必须指定与条件匹配的关键字。我应该在那里传递一个数组吗?
    • 此代码似乎适用于 1 个关键字,但会分解更多。如果输入两个搜索词,您会收到“错误数量的绑定变量”错误。
    【解决方案3】:
    formatted_columns = format_column_names(Sub.column_names)
    where(formatted_columns.map {|cn| "#{cn} like ?" }.join("or "), *(["%#{search}%"] * formatted_columns.size))
    

    这会处理所有列以及正确数量的字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多