【问题标题】:Rails referencing parent id during csv import在 csv 导入期间 Rails 引用父 ID
【发布时间】:2013-07-19 09:17:13
【问题描述】:

首先,我很抱歉提出这样一个基本问题,但我对 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

但我无法使用循环的最后一行设置制造商 ID。我想你可以在这里看到我想要做什么,但我不知道应该怎么写。

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

我可以通过从csv中获取当前的category_id和制造商名称,交叉引用它们并拉回结果的id来设置每条记录的manufacturer_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

【问题讨论】:

  • “制造商ID设置问题”到底是什么?
  • 很抱歉 - 我已添加错误消息。我原以为问题会更明显,只是我糟糕的语法的一个例子。

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


【解决方案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)

【讨论】:

  • 太棒了。再次感谢 jvnill,它按我的意愿工作。
  • 您也可以使用pluck 函数来选择单列(如id),而不是返回整个记录。
  • 谢谢 Slicedpan.. 我去看看试试看!
  • @Slicedpan, pluck 可以在这种情况下使用,但使用 first 更好,因为它只会获取数据库中的第一条记录。如果您有一百万个制造商,pluck 将通过所有制造商。如果你想使用pluck,可以和limit一起使用,或者直接选择id。
  • @jvnill 好点。选择 id 是一个更好的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
相关资源
最近更新 更多