Ruby on rails 库存数量范围为大小的产品型号
我有一个功能完善的自建电子商务网络应用程序,但目前该应用程序假设我们拥有无限数量的网络应用程序 它使用行项目和产品模型 我将添加库存数量作为产品的一个属性 对于没有任何变体(尺寸、颜色等)的项目,如果和库存数量大于一,将创建行项目 但我不知道如何处理尺寸 我应该创造不同的产品吗?即:Ruby on rails 库存数量范围为大小的产品型号,ruby-on-rails,ruby,ruby-on-rails-4,scope,Ruby On Rails,Ruby,Ruby On Rails 4,Scope,我有一个功能完善的自建电子商务网络应用程序,但目前该应用程序假设我们拥有无限数量的网络应用程序 它使用行项目和产品模型 我将添加库存数量作为产品的一个属性 对于没有任何变体(尺寸、颜色等)的项目,如果和库存数量大于一,将创建行项目 但我不知道如何处理尺寸 我应该创造不同的产品吗?即: Shirt.create (name:"small green shirt", color:"green", size:S, stock_QTY:4) Shirt.create (name:"medium gree
Shirt.create (name:"small green shirt", color:"green", size:S, stock_QTY:4)
Shirt.create (name:"medium green shirt", color:"green", size:M, stock_QTY:6)
Shirt.create (name:"large green shirt", color: "green", size:L, stock_QTY:1)
这似乎是重复的,但至少库存数量可以有一些独立性。有没有一种方法可以只创建一个衬衫记录(带有变体),并允许它们具有不同的尺寸
理想情况下,我想
Shirt.create(name:"shirt", colors:['red', 'blue', 'green'], sizes: ['s','m',l'])
然后才能做到
Shirt.where(color => "green").where(size => "L").stock_QTY
=> X number
Shirt.where(color => "green").where(size => "M").stock_QTY
=> Y number
这样我就有了一个模型,但它可以根据变量的范围存储不同的数量。
如果不清楚,请告诉我
谢谢
更新
Product.rb
require 'file_size_validator'
class Product < ActiveRecord::Base
has_many :line_items
before_destroy :ensure_not_referenced_by_any_line_item
mount_uploader :image, ImageUploader
validates :price, :numericality => {:greater_than_or_equal_to => 0.01}
validates :title, :uniqueness => true
def to_param
"#{id}_#{permalink}"
end
private
# ensure that there are no line items referencing this product
def ensure_not_referenced_by_any_line_item
if line_items.empty?
return true
else
errors.add(:base, 'Line Items present')
return false
end
end
end
我理解你想要处理的方法。如果我理解正确的话,这是非常简单的业务逻辑。如果我没弄错的话,你想得到以下东西:
class LineItem < ActiveRecord::Base
# other business logics are here
belongs_to :product
before_validation :check_if_product_available
def check_if_product_available
# you will find your product from controller, model should be responsible to perform business
# decision on them.
if !self.try(:product).nil? && self.product.stock_qty < 1
errors.add(:product, 'This product is not available in the stock')
return false
end
end
end
class LineItem
我认为这是一种有效的方法。而且,在相同的产品模型中保存变量,我建议考虑使用单独的变体模型更有效地设计模型,或者可以利用自关联的能力。p>
我希望这对你有帮助。如果我遗漏了什么或遗漏了你的问题,请告诉我
谢谢所以,我的建议是改进DB模式,使其更加灵活和可扩展;) 定义尺寸和颜色模型(2个新表),将实际产品模型设为基本产品模型(仅重命名表),最后创建产品模型(新表),该模型将有3个外键(基本产品id、颜色id和尺寸id)当然还有stock_qty字段,它定义了所有可能的配置,信息重复最少:) 只要一点帮助,您的最终类模式应该如下所示:
class Color < ActiveRecord::Base
end
class Size < ActiveRecord::Base
end
class BaseProduct < ActiveRecord::Base
# This will have almost all fields from your actual Product class
end
class Product < ActiveRecord::Base
# Ternary table between Color, Size and BaseProduct
end
并对数量进行跟踪:
product.stock_qty
product.color
product.size # size and color are unique for a specific product
您还可以创建一些助手方法,使创建过程与您想要的过程类似(如您的问题所示)。我们可以看看您对
产品模型的实际实现吗?似乎您对DB模型有更多的问题。有多种解决方案可以解决这个问题,但如果你的应用程序“快完成了”,也许你更喜欢最短的oneAdded产品。rb,感谢你的帮助。没问题:)我正在尝试了解你的模型是如何组织的。问题第一部分的那件衬衫怎么样?是产品的一个子类吗?或者是行项目?我在db中添加了衬衫目前的状态。用户选择大小,这属于行项目。好的,我有问题了。从逻辑上讲,购物车项目或行项目应该负责将要添加的内容。它将与产品对话。如果产品可以添加到该购物车中,则产品将作出响应。因此,验证应该放在行项目上。请看一下我的解决方案。您的答案是正确的,但只有在这之后@Peege151才会决定为每个尺寸/颜色组合创建新的产品记录。否则,您无法跟踪特定的尺寸/颜色可用性。在他目前的型号中,他只是拥有一个独特的产品记录,尽管该产品的尺寸/颜色很多。这才是真正的问题,谢谢你的回复@Rubyrider。我的主要问题是在颜色和大小等变量范围内处理给定产品的数量。@Peege151是的,在将产品添加到行项目之前,您正在按所需的任何范围筛选产品(但我假设的是在不同的位置)。:)因此,您首先根据范围选择产品,并将其存储在[at]产品变量(假设)。然后执行一些操作,如:[at]product.add\u到将创建行项目的行项目。如果产品能够作为行项目添加,行项目将使用我的验证方法进行验证。让我知道你是否了解流程?我正在进步,但我有一个问题。。。现在我有了基础产品和产品。每个“添加到可携带物品”都应该是产品吗?现在,一些没有差异的东西(不同大小)作为基础产品存在。因此,一个行项目可以有一个基本产品id或产品id,我觉得这会给我的应用程序添加很多条件逻辑(我真的不想这样)。。。产品模型是否应该有大量重复字段并从基本产品继承?这似乎是重复的,但从长远来看,工作可能会少一些。不确定哪种方法更好。最好只向购物车中添加Product
s,否则(因此使用BaseProduct)您将丢失有关所选颜色和大小的信息。要管理没有两种(或只有一种)尺寸和颜色的BaseProduct,您可以引入特殊记录,如DefaultColor
和DefaultSize
或NoColor
base_product.colors
base_product.sizes
product.base_product # retrieve the base_product from a product
product.stock_qty
product.color
product.size # size and color are unique for a specific product