2016-07-22 32 views
0

Ich bin mir nicht sicher, ob eine Erklärung dafür bereits dokumentiert ist, vielleicht im Nachfragen die falsche Frage, aber ich hoffe, jemand kann mir bei diesem Problem helfen.Einen Wert in einem serialisierten Modell-Array finden

Ich suche nach einem Wert innerhalb eines Modellarrays. Mein Modell sieht wie folgt aus:

class Product < ActiveRecord::Base 
    # product_category :text 
    serialize :product_category, Array 
end 

Ein Beispiel für einen Eintrag:

#<Product:0x0055cd0c1382b8> { 
     :id => 42266, 
     :product_category => [ 
      [0] 8, [1] 3 
     ] 
} 

Ich brauche alle Produkte zu finden, die 3 oder eine Kombination von 3 und anderen Kategorien product_category gehören.

habe ich versucht, so etwas wie

ap Product.where(product_category: [8]) 

aber etwas zurückgeben tut.

Wenn diese Frage bereits gestellt wurde, bitte leiten Sie mich an die richtige Antwort. Wenn nicht, wird jede Zeit, die mir geholfen wird, sehr geschätzt.

Running:

  • Rails 4.2.4
  • Rubin 2.3.1.p112
  • SQLite3
+4

Es sieht so aus, als sollten Sie Ihre Datenbank neu strukturieren und statt Produktspalten eine Produktkategoriespalte verwenden, um 'has_and_belongs_to_many' oder' has_many: through' mit Produktkategorien zu verwenden. Dies würde es einfacher machen, zu suchen. –

+2

Suche nach serialisierten Feld ist unmöglich. Sie sollten Ihre Datenbank neu strukturieren, wie es @ j-dexx vorgeschlagen hat. – mudasobwa

+0

Welche Datenbank benutzen Sie? Welcher Typ ist die Spalte? Wenn Sie in Postgres die JSON-Stilspalte verwenden, können Sie Array-Inhalte abfragen. –

Antwort

2

Obwohl ich das nicht tun würde empfehlen, aber ein Patch Arbeit wäre wie folgt

Product.all.select { |m| m.product_category.include? '3' } 

Verwenden Sie nicht #seriali ze für alle Daten, die auf Sie später benötigen

+0

Dies scheint zu funktionieren, aber wie Sie und andere vorschlagen, werde ich stattdessen meine Datenbank restrukturieren. Danke für deine Antwort. –

+0

Es gibt keine Notwendigkeit, es neu zu strukturieren, wenn Sie nicht viele Fragen haben. Sie können die WHERE-Klausel verwenden, um das Leistungsproblem zu beheben. –

0

Der beste Weg, dies Abfrage zu erreichen, ist durch where-Klausel

Product.where("product_category = ?", [3].to_yaml) 

.to_yaml den Trick.