0

Ich bin auf der Suche nach einer ähnlichen Möglichkeit, die Datenbank like this abzufragen, aber zu kämpfen, wie man geht, was ich will.Abfragen einer Rails-DB-Spalte

Ich bin nicht nur auf der Suche nach der Antwort, ich suche auch, wo finden Sie die Methoden zu verwenden. Ich habe nach Postgres DB-Abfrage, Schienen-DB-Abfrage gesucht, aber nichts zeigt sich, das stimmt, was ich will, oder sogar schließen.

foo = "a,b,c,d" 
b.bar #=> "b,d,a,f,z" Code shorten for the B Class. 

B.where('bar like ?', "%#{foo}") 

Ich weiß, dass nichts zurückgibt. Ich möchte, wenn einer der foo Wert in b.bar Spalte enthalten ist, dann zurückgeben.

Wenn foo = "a", würde ich ein Ergebnis erhalten, aber foo kann mehr als einen Wert haben.

Im mit Ruby 2.2.5. Rails 5. DB: PostgreSQL

Wird auf Ruby 2.3 aktualisieren, wenn der Code sehr einfach ist.

+1

Dies kann durch Verwendung mehrerer 'LIKE'-Bedingungen kombiniert mit' OR' oder durch einen Regexp-Ausdruck erfolgen. Aber ist es das wirklich wert? Diese Art von Abfragen ist normalerweise langsam, weil sie keinen Index verwenden können. Eine viel bessere Lösung bestünde darin, die Daten zu normalisieren und eine 'foos'-Tabelle mit einer 'has_and_belongs_to_many'-Zuordnung zu, B' zu haben. Möglicherweise möchten Sie das Datenbankschema ändern. – spickermann

+0

Ich dachte das Gleiche. Möglicherweise muss ich das Schema ändern, wie du es gesagt hast. – Sylar

Antwort

0

Sie werden vor der eigentlichen Abfragen einige Pre-Arbeit tun sollten, beginnend like Bedingungen mit der Konstruktion für jedes Element in der mit , Liste begrenzt und verketten sie dann mit logischen or:

conditions = b.bar.split(',').map{|x| B.arel_table[:bar].matches("%#{x}%") } 

B.where conditions.reduce(:or) 
0

Dies ist der Weg Einstimmungen für ein Feld in einem Array zu finden:

B.where(bar: ["a", "b", "c"]) 

, dass die Verwendung einer SQL IN operator