2016-06-30 7 views
0

Hallo ich eine Rails-Anwendung haben, in denen ich die TagsRuby on Rails Suche in serialisierten Array durch das Kontrollkästchen

product.rb

class Product < ActiveRecord::Base 

serialize :product_keywords, Array 

scope :with_tag, lambda { |tag| 

        where(["product_keywords LIKE ?", "%"+tag.join("%")+"%"]) 

       } 

end 

in der Ansicht in der serialisierten Form bin Speicherung i haben

<% Product.all.active.each do |product| %> 

        <% product.product_keywords.map do |keywords| %> 
          <div class="checkbox"> 
          <label> 
           <%= check_box_tag("with_tag[]", keywords, false) %> <%= keywords.capitalize %> 
          </label> 
         </div>     
        <% end %> 
       <% end %> 

hier, wenn ich das Produkt mit den Tags finden, die aus dem Kontrollkästchen aus dem Anwendungsbereich in der Anordnung kommen with_tag er holt nur der Datensatz auf der letzten Checkbox basierend geprüft

Sie eine klare Vorstellung von der Abfrage erhalten können

product_keywords LIKE '%tshirt%printed%' 

die product_keywords vorkommenden sind in der Anordnung auf der Tabelle gespeichert.

Wie finde ich die Datensätze, wenn die mehrere sich wiederholende Tags in den Produkten gespeichert sind

Antwort

1

Mit LIKE sollten Sie product_keywords LIKE "%#{tag}%" jeden Tag für generieren.

Schließlich sollte yor sie verbinden sich mit SQL 'OR' oder 'AND' je nach Situation (jeder Tag Anpassung - verwenden OR, alle Tags Matching - verwenden AND)

Angenommen, Sie haben wollen 'UND' Sie können einfach alle Tags iterieren setzen Umfang, etwa wie folgt:

class Product < ActiveRecord::Base 
    serialize :product_keywords, Array 
    scope :with_tag, lambda { |tag| where(["product_keywords LIKE ?", "%#{tag}%") } 
end 

Nutzung

# we have selected tags in tags 
products = Product.all 
tags.each { |tag| products = products.with_tag(tag) } 

Dies wird wo Bedingung für jedes Tag generieren. Viele, wo die Bedingungen in AR von SQL verbunden sind 'UND'

Beispiel SQL-Ausgang für Tags zu [ 'T-Shirt', 'gedruckt'] gesetzt

... WHERE product_keywords LIKE "%tshirt%" AND product_keywords LIKE "%printed%" 

Wenn Sie wollen 'OR' die Tags Bedingungen (passend zu jedem) sollten Sie die vollständigen SQL where-Klausel, zum Beispiel bauen:

scope :with_any_tag, lambda { |tags| 
    # build SQL stmt for all tags, i.e. 
    # (product_keywords LIKE ?) OR (product_keywords LIKE ?) 
    # replace 'OR' with 'AND' if you need all-matching instead of any-matching 
    sql_stmt = tags.collect { |tag| "(product_keywords LIKE ?)" }.join(' OR ') 

    # prepare sql placeholder values, i.e. 
    # %tsrhit%, %printed% 
    sql_placeholders = tags.collect {|tag| "%#{tag}%"} 

    # pass conditions and placeholders to where as a list 
    # first param is a stmt, then all placeholders 
    where([sql_stmt] + sql_placeholders) 
} 

Dies ist allgemeinere Lösung, wie Sie OR-AND und umgekehrt ändern können, je nach Situation.

und dann verwenden, auf diese Weise:

products = Product.with_any_tag(['tshirt', 'printed']) 
+0

, die großen Werke danke :) – user4965201

+0

Sie willkommen :) sind –