在csv导入期间引用父ID的Rails

时间:2013-07-19 09:17:14

标签: ruby-on-rails csv import foreign-keys

首先,我很遗憾提出这样一个基本问题,但我对Rails,Ruby&一般的发展和我缺乏术语理解意味着我很难找到这个问题的答案。

我使用以下方法导入车辆数据csv:

def self.import(file, category_id)
CSV.foreach(file.path, headers: true) do |row|
  Model.where(
  :category_id => category_id, 
  :name => row[1],
  :cap_id => row[10] 
  ).first_or_create do |record|
    record.layout = row[3],

......后来的几条记录......

    record.manufacturer_id = Manufacturer.where(:name => row[0], :category_id => category_id).id
  end
end
end

但是我在使用循环的最后一行设置manufacturer_id时遇到问题。我想你可以看到我在这里想要做什么,但我无法弄清楚应该如何编写。

基本上我有一个属于不同类别的制造商列表(例如,有一个福特制造商,category_id = 1(用于汽车)和另一个福特制造商,category_id = 54用于卡车。

我可以通过从csv获取当前的category_id和制造商名称来设置每条记录的manufacturer_id,交叉引用它们并拉回结果的ID吗?

尝试上述代码时出现以下错误:

NoMethodError in ModelsController#import
undefined method `id' for #<ActiveRecord::Relation::ActiveRecord_Relation_Manufacturer:0x007fcd96f744a8>
Extracted source (around line #33):

32      record.description = row[2],
33      record.manufacturer_id = Manufacturer.where(:name => row[0], :category_id => category_id).id
34    end
35    end
36  end

1 个答案:

答案 0 :(得分:1)

以下代码行返回ActiveRecord::Relation对象

Manufacturer.where(:name => row[0], :category_id => category_id)

因此,当您在其上调用id时,会引发错误。您应首先致电first然后再id

Manufacturer.where(:name => row[0], :category_id => category_id).first.id

请注意,这样做会假定您始终会找到符合条件的制造商。为了更安全,您可以使用try

Manufacturer.where(:name => row[0], :category_id => category_id).first.try(:id)