【问题标题】:Display nested attributes together in view or index.html.erb在 view 或 index.html.erb 中一起显示嵌套属性
【发布时间】:2015-06-02 21:31:24
【问题描述】:

我有一个 Product 模型,该模型具有大部分属性,并且与我的 Product_Images 模型之间存在 has_many 关系。所有更新、编辑等都像魅力一样工作,但我很难将数据带入前端引导主题。

我想要做的是获取最后 5 件产品,并提供默认图片,这样我就可以拥有 产品图片 和相关产品 属性在一起。目前,我在 2 个单独的数组中拥有所有属性和所有图像。

我查看了 group_by,但不知道如何将属性 + 图像按 product_id 从两个数组中组合在一起。我只是不知道该怎么做。

app/controller/home_controller.html.erb

class HomeController < ApplicationController
  def index
    @products = Product.last(5)
    @product_ids = @products.map(&:id)
    @product_images = ProductImage.where(:product_id => @product_ids, 
    :default_image => true )
  end
end

下面基本上转储了两个数组,但它们没有放在一起。每个product_id的图像/属性

app/views/home/index.html.erb

 <% @products.each do |pd| %>
      <%= pd.product_name %>
  <% end %>
  <% @product_images.each do |pi| %>
      <%= image_tag (pi.product_image(:medium)) %>
  <% end %>

我正在寻找的是这样的输出

<div class="col-md-3 col-sm-6 hero-feature">
      <div class="thumbnail">
        <#PRODUCT_IMAGE product_id1> 
        <div class="caption">
          <h3>#PRODUCT_NAME product_id1</h3> 
          <p>#PRODUCT_DESCRIPTION product_id1</p> 
          <p>
          </p>
        </div>
      </div>
    </div>
 <div class="col-md-3 col-sm-6 hero-feature">
          <div class="thumbnail">
            <#PRODUCT_IMAGE product_id2> 
            <div class="caption">
              <h3>#PRODUCT_NAME product_id2</h3> 
              <p>#PRODUCT_DESCRIPTION product_id2</p> 
              <p>
              </p>
            </div>
          </div>
        </div>
 ...etc

回答 SQL 输出;干杯苏洛夫

 Product Load (0.0ms)  SELECT  `products`.* FROM `products`   ORDER BY `products`.`id` DESC LIMIT 5
  SQL (1.0ms)  SELECT  DISTINCT `products`.`id` FROM `products` LEFT OUTER JOIN `product_images` ON `product_images`.`product_id` = `products`.`id` WHERE `product_images`.`product_id` IN (1, 2) AND `product_images`.`default_image` = 1  ORDER BY `products`.`id` DESC LIMIT 5
  SQL (0.0ms)  SELECT `products`.`id` AS t0_r0, `products`.`product_name` AS t0_r1, `products`.`product_description` AS t0_r2, `products`.`product_type_id` AS t0_r3, `products`.`product_category_id` AS t0_r4, `products`.`product_colour_id` AS t0_r5, `products`.`product_size_id` AS t0_r6, `products`.`created_at` AS t0_r7, `products`.`updated_at` AS t0_r8, `product_images`.`product_id` AS t1_r0, `product_images`.`created_at` AS t1_r1, `product_images`.`updated_at` AS t1_r2, `product_images`.`id` AS t1_r3, `product_images`.`product_image_file_name` AS t1_r4, `product_images`.`product_image_content_type` AS t1_r5, `product_images`.`product_image_file_size` AS t1_r6, `product_images`.`product_image_updated_at` AS t1_r7, `product_images`.`default_image` AS t1_r8 FROM `products` LEFT OUTER JOIN `product_images` ON `product_images`.`product_id` = `products`.`id` WHERE `product_images`.`product_id` IN (1, 2) AND `product_images`.`default_image` = 1 AND `products`.`id` IN (2, 1)  ORDER BY `products`.`id` DESC
  Rendered home/index.html.erb within layouts/application (0.0ms)

从 suslov 的回答中更新了 index.htmml.erb 部分

 <div class="row text-center">
      <% @product_images.each do |pd| %>
          <%= content_tag :div, :class => "col-md-3 col-sm-6 hero-feature" do %>
          <% pd.product_images.each do |i| %>
              <div class="thumbnail">
                <%= image_tag (i.product_image(:medium)) %>
          <% end %> </div>
          <div class="caption">
            <h3><%= pd.product_name %></h3>
            <p><%= pd.id %></p>
            <p></p>
          </div>
          <% end %>
      <% end %>
    </div>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord nested-attributes


    【解决方案1】:

    如果您在Product 模型中明确设置了has_many 关联,则可以尝试使用includes(假设名为product_images):

    app/controller/home_controller.rb:

    @products = Product.includes(:product_images)
                       .where(product_images: { default_image: true )
                       .last(5)
    

    app/views/home/index.html.erb:

    <div class="col-md-3 col-sm-6 hero-feature">
      <div class="thumbnail">
        <% @products.each do |pd| %>
            <% pd.product_images.each do |i| %>
                <%= image_tag (i.product_image(:medium)) %>
            <% end %>
        <div class="caption">
          <h3><%= pd.product_name %></h3> 
          <p><%= pd.id %></p> 
          <p></p>
        </div>
        <% end %>
      </div>
    </div>
    

    【讨论】:

    • 非常接近。如果我删除 image_tag 但图像没有显示,属性就可以了。 #<:activerecord_associations_collectionproxy:0x93236a0> 的未定义方法“product_image”
    • 打印出似乎不包含任何图像的数组。
    • @JasonMorelandDigitalrecline:打印生成的 sql 查询。
    • [#, #]
    • @JasonMorelandDigitalrecline:图像不应该在那里。在嵌套循环中打印 i 以查看是否有任何内容。
    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多