1

我正在尝试添加一个简单的库存管理系统。一个类产品有_许多变体,并且变体属于_一个产品,因此有一个product_id,以及一个名称和一个数量。当用户创建产品时,我通过调用以下命令让产品生成 11 个不同的变体(仅使用数值)

Located in variants.rb (model)

  def self.create_multiple_variants( product_id )
    p = Product.find(product_id)
    i = 11
    while i <= 21
      new_variant = Variants.create
      new_variant.product = p
      new_variant.name = (i*2)
      new_variant.qty = 0
      i += 1
    end
  end

然后当用户尝试显示页面时,程序将检查属于产品的每个变体,看看它们是否有任何数量(管理员会在此过程中调整),如下所示:

位于视图中:

<div class="size"><br/>Size: <%= f.select(:size, @sizes_availiable, :prompt => "Select a Size...")

位于 product_controller 中:

@sizes_availiable = Variants.create_inventory_array( @product.id )

位于variants.rb(模型)

  def self.create_inventory_array( product_id )
    p = Product.find(product_id)
    a = []
    p.variants.each do |v|
      a << variant.name if variant.qty > 0
    end
    a
  end

我知道命名有点令人困惑,因为我将它设置为更大但现在不推荐使用它,很抱歉这有点令人困惑。现在您可以将变体视为“大小”

但是它的创建部分工作正常,但是当我去展示产品时,我收到了这条消息:

ProductController 中的名称错误#show

app/models/variants.rb:20:in create_inventory_array' app/controllers/product_controller.rb:18:inshow'

我假设我建立关系的方式是问题的根源,无论是那个还是我如何称呼它。有任何想法吗?


更新:

我使用了下面的建议,现在看来问题出在第二个功能上。这是我的新 variables.rb 和我得到的错误:

class Variants < ActiveRecord::Base
  attr_accessible :product_id, :name, :qty
  belongs_to :product

  def self.create_multiple_variants( product_id )
    p = Product.find(product_id)
    for i in 11..21
      v = Variants.create
      v.product = p
      v.name = (i*2)
      v.qty = 0
      v.save!
    end
  end

  def self.create_inventory_array( product_id )
    p = Product.find(product_id)
    a = []
    p.variants.each do |variant|
      a << variant.name if variant.qty > 0
    end
    a
  end
end



 NoMethodError in ProductController#create

 undefined method `Variants' for #<Product:0x007fe9561ad550>

 Application Trace | Framework Trace | Full Trace
 app/models/variants.rb:8:in `block in create_multiple_variants'
 app/models/variants.rb:7:in `each' app/models/variants.rb:7:in
 `create_multiple_variants' app/controllers/product_controller.rb:33:in
 `create

我仍然认为这是如何建立关系的问题(我正在分配variants.product = current_product,但我称之为product.variants - 我觉得关系不是双向建立的)

4

3 回答 3

1

是的。您需要保存对象。

要在循环结束时保存它:

new_variant.save!

关于这个循环的旁注:

i = 11
while i <= 21
  ...
  i += 1
end

这是一种更好的编写方式,因为它更清晰:

for i in 11..21 do
  ...
end

对于这样的块:

 new_variant = Variants.create
 new_variant.product = p
 new_variant.name = (i*2)
 new_variant.qty = 0
 new_variant.save!

使其更易于阅读:

 v = Variants.create
 v.product = p
 v.name = i*2
 v.qty = 0
 v.save!
于 2013-01-26T06:21:38.717 回答
1

问题出在这段代码中:

p.variants.each do |v|
  a << variant.name if variant.qty > 0
end

您传入变量v,但将其称为variant. 要修复它,请将行更改为

p.variants.each do |variant| 

另请阅读:http ://guides.rubyonrails.org/active_record_querying.html#conditions通过查询所需产品 ID 和数量的变体,然后调用 map 仅获取名称,您可以使代码更加优雅。


这也可以改进:

new_variant = Variants.create
new_variant.product = p
new_variant.name = (i*2)
new_variant.qty = 0

new_variant = p.variants.create name: "#{i*2}", qty: 0
于 2013-01-26T08:39:53.953 回答
0

我发现出了什么问题——我的模型是 Variants.rb(带有 s),它在某些时候会导致问题。我将文件 variables.rb 以及类名 Variants 分别重命名为 variant.rb 和 Variant,重新启动服务器,它就可以工作了!感谢帮助过的人!

于 2013-01-27T21:02:47.163 回答