我正在创建一个电子商务网站,我有一个“大小”下降为客户选择他们的大小。我想要的是下降到只显示根据数据库中持有的“股票”值可用的大小。
有人有这样做的经验或有任何见解吗?
模式中的“尺寸”表
create_table "sizes", force: true do |t|
t.integer "product_id"
t.integer "stock"
t.string "size"
t.datetime "created_at"
t.datetime "updated_at"
endSize.rb
class Size < ActiveRecord::Base
belongs_to :product
endOrder_Product.rb
class OrderProduct < ActiveRecord::Base
belongs_to :order
belongs_to :product
belongs_to :size
endProduct.rb
class Product < ActiveRecord::Base
has_many :order_products
has_many :orders, through: :order_products
has_many :sizes
endproduct/show.html.erb
<%= simple_form_for :basket, url: product_basket_path(@product), remote: true do |f| %>
<%= f.input :quantity, as: :select, collection: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], selected: 1, required: false %>
<%= f.input :size, as: :select, collection: @product.sizes, selected: 0, required: false %>
<%= f.button :submit, "Add to basket" %>
<% end %>非常感谢!
发布于 2014-06-09 09:25:54
向您的大小模型添加一个作用域,并使用它填充select字段。
范围:
class Size < ActiveRecord::Base
belongs_to :product
scope :in_stock, where('stock > 0')
end选择字段:
<%= f.input :size, as: :select, collection: @product.sizes.in_stock, selected: 0, required: false %>在视图中使用作用域而不是过滤,可以让您在其他地方重用in_stock作用域,并执行一个SQL查询,而不是加载所有记录并遍历所有记录。
发布于 2014-06-09 09:24:05
我希望我能准确地理解您想要做的事情;您应该能够使用pluck选择所有可用的大小值,如下所示:
@product.sizes.where('stock >= 1').pluck(:size, :id)编辑:参见道格拉斯F希勒的文章,这个范围比仅仅将Ruby代码放在视图中要优雅得多!
发布于 2014-06-09 14:29:26
从道格拉斯的回答中得到灵感,我发现以下几点值得我去做。
Product.rb
class Product < ActiveRecord::Base
has_many :order_products
has_many :orders, through: :order_products
has_many :sizes
def in_stock
self.sizes.where('stock > 0')
end
endproduct/show.html.erb
<%= f.input :size, as: :select, collection: @product.in_stock, selected: 0, required: false %>谢谢你的帮助!
https://stackoverflow.com/questions/24116946
复制相似问题