2016-06-30 100 views
0

您好我具有其中我在视图存储标签序列化形式Ruby on Rails的序列化阵列搜索通过复选框

product.rb

class Product < ActiveRecord::Base 

serialize :product_keywords, Array 

scope :with_tag, lambda { |tag| 

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

       } 

end 

一个滑轨应用程序我有

<% 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 %> 

在这里,当我找到它在阵列中从范围来从复选框标签的产品210只取基于过去的复选框的选中记录

您可以通过查询存在的

product_keywords LIKE '%tshirt%printed%' 

的product_keywords存储在表中的数组中获得清晰的视力。

我怎么能找到记录,如果多个重复的标签都存储在产品

回答

1

随着LIKE您应该产生product_keywords LIKE "%#{tag}%"对每个标记。 ( - 使用OR,所有标签匹配 - 使用AND任何标记匹配)

假设你想拥有“与”你可以

最后侑应SQLOR”或“AND”视情况加入他们的行列轻松遍历所有的标签设置范围,这样的事情:

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

使用

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

这将生成每个标签的条件。许多地方条件在AR加入了SQL“和”

例如SQL输出设定为[“T恤”,“印刷”]标签

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

如果你想“或”标签条件(匹配的话)你应该建立完整的SQL where子句,例如:

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

这是更普遍的解决方案,因为你可以改变ORAND,反之亦然,视情况而定。

,然后用它是这样的:

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

那伟大工程谢谢:) – user4965201

+0

欢迎你:) –