2016-03-18 12 views
1

В моем приложении rails, как я могу запросить несколько полей из моей базы данных? В настоящее время при поиске пользователя для продукта на основе ключевых слов, запрос только получить name поле из БД:Ruby on Rails запрашивает несколько полей

@products = @products.where("lower(name) LIKE ?", "%#{params[:search_free_text].downcase}%") 

Мне нужно включать, description и highlight как в текстовом формате в запросе. Благодаря!!

ответ

3

Это можно сделать с помощью SQL, как это:

@products = @products.where(
    %w(name description highlight).map { |column_name| 
    "lower(#{column_name}) LIKE :query" 
    }.join(' OR '), 
    query: "%#{params[:search_free_text].downcase}%") 

Я бы сказал, что это стоит того, чтобы использовать объем:

# in your app/models/product.rb 
FULLTEXT_COLUMNS = %w(name description highlight) 
scope :search, lambda { |query| 
    where(
    FULLTEXT_COLUMNS.map { |c| "lower(#{c}) LIKE :query" }.join(' OR '), 
    query: "%#{query.downcase}%" 
) 
} 

# in your controller: 
@products = @products.search(params[:search_free_text]) 
+0

Отлично работает !!! Благодаря!! – d3bug3r

1

Вам просто нужно следовать формату SQL, чтобы сделать это:

@products = @products.where("lower(name) LIKE :query OR description LIKE :query", query: "%#{params[:search_free_text].downcase}%") 
+0

Привет, что такое 'PARAMS [: description_text]' для? – d3bug3r

+0

Это просто предположение с моей стороны. Вам нужно передать 'params' для' description', который вы получаете из представления – Deep

+1

@Deep: вы не должны строить SQL-запросы с помощью строковой интерполяции. Это небезопасно и может использоваться для атак [SQL injection] (https://en.wikipedia.org/wiki/SQL_injection). Всегда используйте Rails '' где ('... LIKE ...') 'с [массивом или хэшем] (http://stackoverflow.com/a/26094593/2483313). – spickermann

0

Попробуйте таким образом сделать сферу в модели Product

class Product < ActiveRecord::Base 
    scope :search_ndh, -> (name_text, desc_text, highlight_text){where("lower(name) LIKE :name OR description LIKE :desc OR highlight LIKE :high", name: "%#{name_text.downcase}%", desc: "%#{desc_text}%", high: "%#{highlight_text}%")} 
end 

и теперь используют сферу

@products.search_ndh(params[:search_free_text].downcase, params[:search_description_text], params[:search_highlight_text]) 

или Arel ways

products = Product.arel_table 
    Product.where(products[:name].matches("%#{params[:search_free_text]}%").or(products[:description].matches("%#{params[:search_description_text]}%")).or(products[:highlight].matches("%#{params[:search_highlight_text]}%"))) 

или в объеме с помощью динамических полей

class Product < ActiveRecord::Base 
    SEARCH_COLUMNS = [:name, :description, :highlight] 
    scope :search, lambda{ |q| where(SEARCH_COLUMNS.map{|c| self.arel_table[c].matches("%#{q}%").to_sql}.join(' OR '))} 
end 

и затем

Product.search(params[:search_text]) 

он будет генерировать

Product.search("das") 

SELECT "products".* FROM "products" WHERE ("products"."name" LIKE '%das%' OR "products"."description" LIKE '%das%' OR "products"."highlight" LIKE '%das%') 

 Смежные вопросы

  • Нет связанных вопросов^_^