Ruby on Rails:在一次搜索中使用两个字符串进行高级搜索

时间:2018-02-09 22:17:50

标签: ruby-on-rails

我在使用两个字符串理解高级搜索时遇到了问题 请帮忙

错误coms:

  

未定义的方法`其中'对于#

<ActiveRecord::QueryMethods::WhereChain:0x007f2dcc0da5b0>
搜索模型中的

search.rb

def search_books
  books = Book.all
  books = books.where{["name LIKE ?","%#{keywords}%"]}if keywords.present?
  books = books.where{["category LIKE ?","%#{keywords}%"]}if keywords.present?

  return books
end

2 个答案:

答案 0 :(得分:1)

使用如下所示:

  

keywords ='test'

与AND:

Book.where("name LIKE '%#{keywords}%' AND category LIKE '%#{keywords}%'") if keywords.present?

使用OR:

Book.where("name LIKE '%#{keywords}%' OR category LIKE '%#{keywords}%'") if keywords.present?

但这种用法并不安全。阅读Rails documentation中的以下警告:

  

将自己的条件构建为纯字符串可能会让您感到脆弱   到SQL注入攻击。例如,Client.where(“first_name LIKE   '%#{params [:first_name]}%'“)不安全。

答案 1 :(得分:0)

如果您想使用范围进行搜索,可以在控制器中执行类似的操作

    def index     
      @books = Book.all

      # scopes
      if params[:keyword].present? 
        @books = @books.by_keyword(params[:keyword])
      end
   end

然后在你的模型中做下面的

  scope :by_keyword, ->(keyword) { where('name LIKE ? AND category LIKE ?', "%#{keyword}%", "%#{keyword}%").order(updated_at: :desc) if keyword.present? }