【发布时间】: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_counties,row.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