/ / Ruby on Rails - Търсене Запитване за думи в заглавието - ruby, ruby-on-rail-4, search, scope, filterrific

Ruby on Rails - Търсене Запитване за думи в заглавието - руби, руби-на-релси-4, търсене, обхват, filterrific

В молбата ми правя а scope/search за :title за търсене / филтър на моите записи. Самият процес работи добре, само че потребителят трябва да напише точно title и не могат да търсят дума в рамките на :title.

Например Ако title е: Това търсене е готино, потребителят трябва да започне търсенето и да има пълното изречение: Това търсене да търсят и не могат да пишат е готин и да получат записи, които имат е готин в заглавието.

мой scope изглежда като:

class Post < ActiveRecord::Base

scope :search_query, lambda { |query|
return nil  if query.blank?
# condition query, parse into individual keywords
terms = query.downcase.split(/s+/)
# replace "*" with "%" for wildcard searches,
# append "%", remove duplicate "%"s
terms = terms.map { |e|
(e.gsub("*", "%") + "%").gsub(/%+/, "%")
}
# configure number of OR conditions for provision
# of interpolation arguments. Adjust this if you
# change the number of OR conditions.
num_or_conditions = 1
where(
terms.map {
or_clauses = [
"LOWER(posts.title) LIKE ?"
].join(" OR ")
"(#{ or_clauses })"
}.join(" AND "),
*terms.map { |e| [e] * num_or_conditions }.flatten
)
}

Как мога да направя моя scope/query така че потребителят може да търси думи в рамките на title и да получат записи, които имат думи, които са търсили?

Опитах се с ILIKE, но търсенето спре да работи в развитие, Аз мисля, че заради sqlite не може да има ILIKE, но в productionтърсенето работи, но все още не може да търси думи в заглавията.

Когато използвам LIKE, sql заявката беше:

SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "posts" WHERE ((LOWER(posts.title) LIKE "rails%")) LIMIT 50 OFFSET 0) subquery_for_count

Докато използвах ILIKE, въпросът беше:

SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "posts" WHERE ((LOWER(posts.title) ILIKE "rails%")) LIMIT 50 OFFSET 0) subquery_for_count

SQLite3::SQLException: near "ILIKE": syntax error: SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "posts" WHERE ((LOWER(posts.title) ILIKE "rails%")) LIMIT 50 OFFSET 0) subquery_for_count

PS: Използвам Filterrific gem

използвам pg gem за Production ENV & sqlite3 за Development ENV

Отговори:

1 за отговор № 1

Както е описано в това w3schools статия, LIKE работи като:

WHERE CustomerName LIKE "a%" => Finds any values that starts with "a"
WHERE CustomerName LIKE "%a" => Finds any values that ends with "a"
WHERE CustomerName LIKE "%or%" => Finds any values that have "or" in any position
WHERE CustomerName LIKE "_r%" => Finds any values that have "r" in the second position
WHERE CustomerName LIKE "a_%_%" =>  Finds any values that starts with "a" and are at least 3 characters in length
WHERE ContactName LIKE "a%o" => Finds any values that starts with "a" and ends with "o"

Трябваше да се променя (e.gsub("*", "%") + "%").gsub(/%+/, "%"), да се: ("%" + e.gsub("*", "%") + "%").gsub(/%+/, "%") .

Когато търсите с (e.gsub("*", "%") + "%").gsub(/%+/, "%"), резултатът би бил (LOWER(posts.title) ILIKE "keyword%"), където ("%" + e.gsub("*", "%") + "%").gsub(/%+/, "%"), бих дал (LOWER(posts.title) ILIKE "%keyword%")