关系 - 访问儿童元素

时间:2013-01-26 03:41:38

标签: ruby-on-rails ruby

我试图添加一个简单的库存管理系统。类产品has_many变体,变体属于产品,因此具有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(model)

  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

我知道命名它有点令人困惑,因为我把它设置为更大但现在不赞成它,所以抱歉这有点令人困惑。现在您可以将变体视为&#34; size&#34;

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

  

ProductController中的NameError#show

     

app / models / variants.rb:20:in create_inventory_array' app/controllers/product_controller.rb:18:in show&#39;

我认为我建立关系的方式是问题的根源,无论是我或者如何调用它。有什么想法吗?


更新:

我使用了下面的建议,现在看来问题在于第二个功能。这是我的新变种.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 - 我觉得这种关系并没有同时建立方式)

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分: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您可以通过查询所需product_id和qty的变体,然后调用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

答案 2 :(得分:0)

我弄清楚出了什么问题 - 我的模型是Variants.rb(带有s),这在某些时候引起了问题。我将文件variants.rb以及类名Variants重命名为variant.rb和Variant,重新启动了服务器,它工作正常!感谢那些帮助过的人!