如何在Ruby on Rails中将现有ID分配给种子文件?

时间:2017-10-03 17:19:15

标签: ruby-on-rails

所以我有一个包含大量数据的文件,我正试图将其插入数据库并将其分配给购物车。我已经开始创建了一个购物车,我只想把所有东西都分配给一个单一的购物车。问题是试图找到我应该实际放置cart_id的位置。种子看起来像这样:

 require 'csv'

 csv_text = File.read(Rails.root.join('lib', 'seeds', 'IronGloryInventory.csv'))
 csv = CSV.parse(csv_text, :headers => true, :encoding => 'ISO-8859-1')
 csv.each do |row|
 @product = row.to_hash
 t = Product.new
 t.product_name = row['Product']
 t.sku = row['SKU']
 t.price = row['Price']
 t.year = row['Year']
 t.quantity = row['Available'].gsub(/\:|\D/, '')
 t.size = row['Available'].gsub(/\:|\d/, '')
 t.category = row['Category']
 t.description = row['Description']
 t.save
 puts "#{t.product_name}, #{t.year}, #{t.size}, #{t.category} "
end

我尝试将t.cart_id = 1放在t = Product.new下,我得到NoM​​ethodError。

我已经尝试将它放在csv.each上面,并使用product.cart_id = 1,我得到一个未定义的局部变量。

我觉得它实际上应该在迭代中分配id但我无法理解它。

购物车与has_many的产品有关联,而Product有belongs_to。任何方向都会非常有用。

1 个答案:

答案 0 :(得分:0)

您的商品模型中没有cart_id属性,这就是NoMethodError的原因。

您可以创建相应的迁移来添加它,运行db:migrate以在架构中保留更改并重试。

$ rails g migration add_cart_to_products cart:references
$ rails db:migrate

product.cart_id分配必须在each块内,否则Rails会尝试找到一个名为product的局部变量,该变量不存在。

require 'csv'

csv_text = File.read(Rails.root.join('lib', 'seeds', 'IronGloryInventory.csv'))
csv = CSV.parse(csv_text, headers: true, encoding: 'ISO-8859-1')
csv.each do |row|
  product = Product.new
  product.product_name = row['Product']
  product.sku = row['SKU']
  product.price = row['Price']
  product.year = row['Year']
  product.quantity = row['Available'].gsub(/\:|\D/, '')
  product.size = row['Available'].gsub(/\:|\d/, '')
  product.category = row['Category']
  product.description = row['Description']
  product.cart_id = 1
  product.save
  puts "#{product.product_name}, #{product.year}, #{product.size}, #{product.category} "
end