我最近开始学习Ruby on Rails,现在我正在开发我的第一个电子商务Web应用程序。应用程序数据库目前有两个表:products
和variants
products
包含id
,name
,description
等。每个产品可能有多种变体。
variants
包含id
,product_id
,price
,image
等。它还有一个布尔字段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
表中获取image
和variants
等数据的最佳方法是什么?我想将视图中的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
答案 0 :(得分:0)
基本上,您可以直接从variants
获取product
<% @products.each do |product| %>
<% product.variants.each do |variant| %>
...render your variant...
<% end %>
<% end %>
这会在以后导致N + 1查询问题,因为每次从variants
获得product
时,都会运行查询。因此,我们可以对@products
ProductsController
进行急切加载
@products = Product.includes(:variants).paginate(:page => params[:page], :per_page => 5)
@variants
中的 VariantsController
未绑定到ProductsController
,VariantsController
中的实例变量将用于变体视图。您在产品视图中。
答案 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 %>
等产生什么影响