gpt4 book ai didi

ruby-on-rails - Ruby & Rails - 使用 CSV 中的关联播种数据

转载 作者:行者123 更新时间:2023-11-29 12:10:34 24 4
gpt4 key购买 nike

我是 Ruby & Rails 的新手,我正在尝试使用来自两个 CSV 文件的数据为 Rails 数据库播种,并在它们之间创建关联。这是我目前所拥有的:

种子.rb

require "csv"

City.destroy_all
Skyscraper.destroy_all

csv_text = File.read(Rails.root.join("public", "cities.csv"))
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
c = City.new
c.city_name = row["city_name"]
c.country = row["country"]
c.save
puts "#{c.city_name}, #{c.country} saved"
end

csv_text = File.read(Rails.root.join("public", "skyscrapers.csv")).encode!("UTF-8", "binary", invalid: :replace, undef: :replace, replace: "?")
csv = CSV.parse(csv_text, :headers => true, :encoding => "iso-8859-1:utf-8")
csv.each do |row|
s = Skyscraper.new
s.rank = row["rank"]
s.name = row["name"]
s.city_name = row["city_name"]
s.country = row["country"]
s.heightM = row["heightM"]
s.heightF = row["heightF"]
s.floors = row["floors"]
s.completedYr = row["completedYr"]
s.materials = row["materials"]
s.use = row["use"]
city = City.find_by(city_name: row["city_name"])
s.city = city
s.save
puts "#{s.rank}, #{s.name}, #{s.city_name}, #{s.country}, #{s.heightM}, #{s.heightF}, #{s.floors}, #{s.completedYr}, #{s.materials}, #{s.use} saved"
end

迁移:

class CreateCities < ActiveRecord::Migration
def change
create_table :cities do |t|
t.string :city_name
t.string :country
end
end
end


class CreateSkyscrapers < ActiveRecord::Migration
def change
create_table :skyscrapers do |t|
t.integer :rank
t.string :name
t.string :city_name
t.string :country
t.integer :heightM
t.integer :heightF
t.integer :floors
t.integer :completedYr
t.string :materials
t.string :use
t.references :city, index: true, foreign_key: true
end
end
end

架构.rb

ActiveRecord::Schema.define(version: 20160603210529) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"

create_table "cities", force: :cascade do |t|
t.string "city_name"
t.string "country"
end

create_table "skyscrapers", force: :cascade do |t|
t.integer "rank"
t.string "name"
t.string "city_name"
t.string "country"
t.integer "heightM"
t.integer "heightF"
t.integer "floors"
t.integer "completedYr"
t.string "materials"
t.string "use"
t.integer "city_id"
end

add_index "skyscrapers", ["city_id"], name: "index_skyscrapers_on_city_id", using: :btree

add_foreign_key "skyscrapers", "cities"
end

我能够完成所有迁移并为种子文件的“城市”部分播种。但是当我播种“摩天大楼”时,出现以下错误:

NoMethodError: undefined method `city=' for #<Skyscraper:0x007fa6ec913be8>
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activemodel-4.2.6/lib/active_model/attribute_methods.rb:433:in `method_missing'
/Users/AndrewSM/wdi/Projects/skyscrapers/db/seeds.rb:42:in `block in <top (required)>'
/Users/AndrewSM/wdi/Projects/skyscrapers/db/seeds.rb:29:in `<top (required)>'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `block in load'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3@global/gems/railties-4.2.6/lib/rails/engine.rb:547:in `load_seed'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.6/lib/active_record/tasks/database_tasks.rb:250:in `load_seed'
/Users/AndrewSM/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.6/lib/active_record/railties/databases.rake:183:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)

在 seeds.rb 中,第 42 行引用“s.city = city”,第 29 行引用“csv.each do |row|”。最初我认为外键中的城市与表中也名为“city”的行之间可能存在冲突,所以我将每个表中的行标题更改为“city_name”(这些曾经只是“city” ).但是,我得到了同样的错误。当我注释掉第 42 行 (s.city = city) 时,一切都会迁移和播种,但没有关联。

提前感谢您的反馈。

最佳答案

尝试将“id”主键列添加到“cities”表(实际上,在所有表上都有“id”是一个很好的做法),然后将第 42 行更改为:

s.city_id = city.id

关于ruby-on-rails - Ruby & Rails - 使用 CSV 中的关联播种数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37925197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com