【问题标题】:comma separated string with Advance Search使用高级搜索的逗号分隔字符串
【发布时间】:2015-02-19 17:12:52
【问题描述】:

我已使用此tutorial 在我的图书应用程序中添加了高级搜索。一切正常,但现在我正试图通过标签找到一本书。

如果用户在 :keywords text_field 中输入一个标签,我就可以进行高级搜索。

有没有办法通过用逗号分隔关键字字符串来搜索各种标签?

(ex: fun, kid stories, action) 
Would allow me to search books with fun OR kids stories OR actions.

如何通过逗号分隔的字符串搜索多个标签?

注意:我创建了一个我认为可以提供帮助的搜索方法,但我不确定如何将它与单个关键字搜索结合起来。

型号

class Book < ActiveRecord::Base

  has_many :book_mappings
  has_many :tags, through: :book_mappings

end


class BookMapping < ActiveRecord::Base
  belongs_to :book
  belongs_to :tag
end

class Tag < ActiveRecord::Base

  has_many :book_mappings
  has_many :books, through: :book_mappings

end


class Search < ActiveRecord::Base

  def books
    @books ||= find_books
  end

  def find_books
    books = Book.order(:name)

    ###This works for a single word but NOT if I have multiple tags separated by commas
    books = books.joins(:tags).where("tags.name like ?", "%#{keywords}%") if keywords.present?

    books
  end

  def search(keywords)
     return [] if keywords.blank?
     cond_text = keywords.split(', ').map{|w| "name LIKE ? "}.join(" OR ")    
     cond_values = keywords.split(', ').map{|w| "%#{w}%"}
     all(:conditions =>  (keywords ? [cond_text, *cond_values] : []))
  end

end

观看次数

<%= form_for @search do |f| %>

  <div class="field">
    <%= f.label :keywords %><br />
    <%= f.text_field :keywords %>
  </div>

<% end %>

【问题讨论】:

    标签: sql ruby search ruby-on-rails-4 tagging


    【解决方案1】:

    这是一个简单的解决方案。只需为每个关键字添加 like 语句即可。

    过滤所有标签的书

    if keywords.present?
      books = books.joins(:tags)
      keywords.tr(' ','').split(',').each do |keyword|
        books = books.where("tags.name like ?", "%#{keyword}%") 
      end
    end
    

    过滤带有任何标签的书籍

    if keywords.present?
      books = books.joins(:tags)
    
      keyword_names = keywords.split(', ')
      cond_text = keyword_names.map{|w| "tags.name like ?"}.join(" OR ")
      cond_values = keyword_names.map{|w| "%#{w}%"}
    
      books = books.where(cond_text, *cond_values)
    end
    

    【讨论】:

    • 目前这给了我:(tags.name like '%fun%') AND (tags.name like '%action%') 有没有办法使用 OR 与 AND。所以它本质上搜索有一个或两个都有的书......
    • 由于某种原因,标签没有被正确过滤。 SELECT books.* FROM books INNER JOIN book_mappings ON book_mappings.book_id = books.id INNER JOIN tags ON tags.@9876 987654335@ ORDER BY books.name ASC
    • OR 代码实际上给了我整个 book_mapping 表。
    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多