Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 库存数量范围为大小的产品型号_Ruby On Rails_Ruby_Ruby On Rails 4_Scope - Fatal编程技术网

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