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

私はそれをより大きなものとして設定していますが、今のところ非推奨にしているので、命名が少し混乱していることを知っています。少し混乱して申し訳ありません。今のところ、バリアントは「サイズ」と考えることができます

ただし、作成部分は正常に機能しますが、製品を表示すると、次のメッセージが表示されます。

NameError in ProductController#show

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

私が関係を構築している方法が問題の原因であると思います。何か案は?


アップデート:

以下の提案を使用しましたが、問題は 2 番目の関数にあるようです。ここに私の新しい variants.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必要な 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
于 2013-01-26T08:39:53.953 に答える
0

私は何が間違っているのかを理解しました-私のモデルはVariants.rb(s付き)であり、ある時点で問題を引き起こしました。ファイルvariants.rbとクラス名Variantsの名前をそれぞれvariant.rbとVariantに変更し、サーバーを再起動すると、機能しました。助けてくれた人たちに感謝します!

于 2013-01-27T21:02:47.163 に答える