2017-05-18 7 views
0

In meiner Anwendung mache ich eine scope/search auf :title für eine Suche/Filter meiner Aufzeichnungen. Die Suche selbst funktioniert gut, nur die Sache ist, dass Benutzer genau die title & schreiben müssen, die sie nicht innerhalb der :title suchen können.Ruby on Rails - Suche Suche nach Wörtern innerhalb des Titels

Zum Beispiel, wenn die title ist:Diese Suche ist kühl, Benutzer müssen die Suche und haben den kompletten Satz starten: Diese Suche zu suchen und sie können nicht schreiben kühlen ist und erhalten Aufzeichnungen, die haben, ist im Titel cool.

Mein scope wie folgt aussieht:

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 
    ) 
    } 

Wie kann ich meine scope/query so Benutzer machen Wörter innerhalb des title suchen und Aufzeichnungen erhalten, die Worte, die sie für haben gesucht hat?

ich mit ILIKE versucht, aber dann stoppen die Suche in der Entwicklung arbeiten, ich glaube, seine wegen sqlite nicht ILIKE haben kann, aber in production die Suche gearbeitet, aber noch nicht für Wörter innerhalb Titel suchen können.

Als ich LIKE verwenden, die sql Abfrage lautete:

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 

Während, wenn ich ILIKE verwendet, die Abfrage war:

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: Im Filterrific gem mit

Ich benutze pg gem für Production ENV & sqlite3 für Development ENV

+0

ein kurzer Blick sagt mir geben würde, Sie ILIKE für pg und sqlite3 – marmeladze

+0

Dank @marmeladze verwenden sollte, habe ich versucht, mit 'ILIKE ', aber dann funktioniert die ganze Suche nicht. Sogar was vorher funktioniert hat. – Rubioli

+0

http://railscasts.com/episodes/37-simple-search-form könnte nützlich sein – Mark

Antwort

0

Wie der beschrieben in diesem w3schools article, LIKE Werke wie:

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" 

Ich brauchte (e.gsub('*', '%') + '%').gsub(/%+/, '%'), ändern zu:('%' + e.gsub('*', '%') + '%').gsub(/%+/, '%').

Wenn mit (e.gsub('*', '%') + '%').gsub(/%+/, '%') suchen, Ergebnis (LOWER(posts.title) ILIKE 'keyword%') sein würde, wo als ('%' + e.gsub('*', '%') + '%').gsub(/%+/, '%'), (LOWER(posts.title) ILIKE '%keyword%')

Verwandte Themen