代码之家  ›  专栏  ›  技术社区  ›  Serge Pedroza

带高级搜索的逗号分隔字符串

  •  0
  • Serge Pedroza  · 技术社区  · 9 年前

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

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

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

    (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 %>
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Serge Pedroza    9 年前

    这里有一个简单的解决方案。只需添加一个 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