【问题标题】:importing csv into ruby but need to create relationship将 csv 导入 ruby​​ 但需要创建关系
【发布时间】:2016-06-08 16:36:58
【问题描述】:

我想导入 2 个文件(县和州)。当我导入时,我需要创建与县到州的关系。

我的州 CSV 文件有:

  • id
  • state 例如“康涅狄格”
  • abbreviation 例如“CT”

我的县 CSV 文件有:

  • id
  • name 例如“哈特福德”
  • market_state 例如“康涅狄格”

MarketCounty 的属性是:

create_table "market_counties", force: :cascade do |t|
  t.string   "name"
  t.integer  "market_state_id"
  t.datetime "created_at",      null: false
  t.datetime "updated_at",      null: false
end

MarketState 的属性是:

create_table "market_states", force: :cascade do |t|
  t.string   "name"
  t.string   "abbreviation"
  t.datetime "created_at",   null: false
  t.datetime "updated_at",   null: false
end

我的模型有这些关系:

市场状态:

class MarketState < ActiveRecord::Base
  has_many :market_reports, as: :location
  has_many :market_cities
  has_many :market_zips
  has_many :market_counties  
end

市场县:

class MarketCounty < ActiveRecord::Base
  has_many :market_reports, as: :location
  has_many :market_cities
  has_many :market_zips
  belongs_to :market_state
end

我的耙子任务:

def import_market_states
  MarketState.create!(name: "Connecticut", abbreviation: "CT")
end

def import_market_counties
  path = Rails.root.join("config/csv/locations/counties.csv")
  CSV.foreach(path, headers: true) do |row|
    MarketCounty.create! row.to_hash
  end

我的问题是方法import_market_countiesrow.to_hash 不起作用。

ActiveRecord::AssociationTypeMismatch: MarketState(#70157557268540)
expected, got String(#70157439770720)

我手动设置的:

MarketCity.create!(name: "Hartford", market_state: MarketState.find_by(abbreviation: "CT")

导入县文件时如何在循环中进行“查找”(将其与 MarketState 模型相关联)?

澄清一下,问题是当我创建县时,我并没有尝试用 CT 填充州。我需要用关联填充 state_id。

我发现了这个:When importing a CSV, how do I handle data in a row that corresponds to an association? --- 并且认为它可能与我正在尝试做的类似 - 只是不知道如何在这里应用它。

【问题讨论】:

  • 请编辑您的问题以包含您正在使用的数据的示例。你说“row.to_hash 不起作用”但你忘了说row 是什么样的。
  • 已修改 - 见上文。在上面添加了详细信息。
  • config/csv/locations/counties.csv 文件的一行是什么?
  • 见上文:我县的 csv 文件具有 id:名称:Hartford market_state:康涅狄格
  • 您想使用 CSV 中的 id 字段作为模型的 id 属性,还是希望这些属性由您的数据库自动生成? (除非您知道永远不会与数据库中的数据发生冲突,否则后者更安全,但如果 id 字段在其他方面很重要,您可能不想丢失它。)

标签: ruby-on-rails ruby csv


【解决方案1】:

假设您的 MarketState 有一个 name 列是状态的名称:

def import_market_counties


path = Rails.root.join("config/csv/locations/counties.csv")
  CSV.foreach(path, headers: true) do |row|
    MarketState.find_by_name( row['market_state'].strip )
  end

如果你想创建不存在的状态,你也可以使用 find_or_create_by。

【讨论】:

  • 但是我如何填充 County 字段 (market_state_id),它是 County 字段上的关联?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
相关资源
最近更新 更多