多维实例循环

时间:2015-12-31 02:35:29

标签: ruby-on-rails postgresql haml

我正在尝试使用自定义SQL查询来显示产品的不同属性,即大小和价格。我在控制台中运行时的查询显示应该

SELECT products.id, products.name, variant_properties.description, LEFT(variant_properties.description,1) as short_desc, variants.price FROM products
  INNER JOIN product_properties ON product_properties.product_id = products.id
  INNER JOIN variant_properties on product_properties.property_id = variant_properties.property_id AND variant_properties."primary" = true
  INNER JOIN properties ON properties.id = product_properties.property_id AND properties.id = variant_properties.property_id AND properties.display_name = 'Size'
  INNER JOIN variants on variants.product_id = products.id AND variants.id = variant_properties.variant_id

enter image description here

在我的HAML模板中,我做了以下

- @products.each_with_index do |product, i|
  .product-list.grid-block
    .small-8.grid-content.text-center
      %h4= product.name.titlecase
      - @sizes.each do |size|
        = link_to size.short_desc, product, class: 'hollow button tiny'
        %small= size.price

并在控制器中

products = Product.active
    # products = Product.active.includes(:variants)

    product_types = nil
    if params[:product_type_id].present? && product_type = ProductType.find_by_id(params[:product_type_id])
      product_types = product_type.self_and_descendants.map(&:id)
    end
    if product_types
      @products = products.where(product_type_id: product_types)
    else
      @products = products
    end

      @sizes = Product.find_by_sql("SELECT products.id, LEFT(variant_properties.description,1) as short_desc, variants.price FROM products
  INNER JOIN product_properties ON product_properties.product_id = products.id
  INNER JOIN  variant_properties on product_properties.property_id = variant_properties.property_id
  INNER JOIN properties ON properties.id = product_properties.property_id AND properties.id = variant_properties.property_id AND properties.display_name = 'Size'
  INNER JOIN  variants on variants.product_id = products.id AND variants.id = variant_properties.variant_id")

理想情况下,我试图让它看起来像下面这样,但我遇到了实现这个问题的问题

enter image description here

1 个答案:

答案 0 :(得分:1)

首先要注意的是Model.find_by_sql将返回一个模型列表,无论你在sql查询中选择什么,都会返回。

所以我建议的解决方案是尝试转换为ActiveRecord :: Relation,如下所示:

Product.joins(:product_properties)
       .joins('INNER JOIN variant_properties on product_properties.property_id = variant_properties.property_id')
       .joins('INNER JOIN properties ON properties.id = product_properties.property_id AND properties.id = variant_properties.property_id AND properties.display_name = \'Size\'')
       .joins('INNER JOIN  variants on variants.product_id = products.id AND variants.id = variant_properties.variant_id')
       .pluck('products.id', 'LEFT(variant_properties.description,1)', 'variants.price')

我还没有尝试过,但我认为它可以产生一个包含你需要的值的数组。