将不同表中的数据拖入单个视图中

时间:2016-01-31 20:16:43

标签: ruby-on-rails ruby model-view-controller controller

我最近开始学习Ruby on Rails,现在我正在开发我的第一个电子商务Web应用程序。应用程序数据库目前有两个表:productsvariants

products包含idnamedescription等。每个产品可能有多种变体。

variants包含idproduct_idpriceimage等。它还有一个布尔字段default_var,用于确定默认值当用户第一次看到产品时应该在页面上显示的变体。

这就是模型的样子:

class Product < ActiveRecord::Base
  has_many :variants
end

class Variant < ActiveRecord::Base
  belongs_to :product
  scope :default, -> {where(dafault_var: 1)}
end

在索引页面上,我希望能够显示产品列表,旁边有图像,价格和描述,因此信息应该是两个表中值的组合。

在index.erb视图文件中,如果我尝试使用each方法迭代产品数组,我必须使用索引变量:

<% @products.each do |product| %>

我无法想到通过这个局部变量访问变体控制器方法的方法。从price表中获取imagevariants等数据的最佳方法是什么?我想将视图中的Ruby代码保持在最低限度。

控制器目前有以下代码:

class ProductsController < ApplicationController
  def index
    @products = Product.paginate(:page => params[:page], :per_page => 5)
    #@products = Product.all
  end

...

class VariantsController < ApplicationController
  def index
    @product = Product.find(params[:id])
    @variants = @product.variants
  end
end

3 个答案:

答案 0 :(得分:0)

  1. 基本上,您可以直接从variants获取product

    <% @products.each do |product| %>
      <% product.variants.each do |variant| %>
        ...render your variant...
      <% end %>    
    <% end %> 
    
  2. 这会在以后导致N + 1查询问题,因为每次从variants获得product时,都会运行查询。因此,我们可以对@products

    中的ProductsController进行急切加载
    @products = Product.includes(:variants).paginate(:page => params[:page], :per_page => 5)
    
  3. 无论如何,@variants中的
  4. VariantsController未绑定到ProductsControllerVariantsController中的实例变量将用于变体视图。您在产品视图中。

答案 1 :(得分:0)

因为您有一个默认变体,它具有图片和价格,我会做这样的事情

prob

答案 2 :(得分:0)

访问ActiveRecord的{​​{1}}方式是使用:

variants

由于您使用的是#app/views/products/index.html.erb <% @products.each do |product| %> <% @product.variants.each do |variant| %> <%= variant.name %> <% end %> <% end %> ,因此您可以将has_many变体指定为关联,甚至可以使用ActiveRecord Association Extension

default

这将允许您致电:

#app/models/product.rb
class Product < ActiveRecord::Base
   has_many :variants do
      def default 
        find_by default_var: true #-> @product.variants.default
      end
   end
   has_one  :default_variant, -> { find_by(default_var: true) }, class_name: "Variant", foreign_key: :product_id #-> @product.default_variant
end

-

我不知道这会对#app/views/products/index.html.erb <% @products.each do |product| %> <%= product.default_variant.name %> <% end %> 等产生什么影响