如何在 rails activerecord 中播种 sqlite3 数据库?
How do I seeds sqlite3 data base in rails activerecord?
我正在尝试通过 rails ActiveRecord 中 sqlit3 数据库上的 seed.rb 文件填充航班 table,代码如下:
departure = Date.new(2021, 9, 1)
arrival = Date.new(2021, 10, 1)
(departure).upto(arrival).each do |flight_schedule|
airports.each do |origin|
airports.each do |destination|
if origin == destination
next
else
3.times { Flight.create(origin: origin,
destination: destination,
flight_schedule: flights_time,
duration: flights_duration(origin.code, destination.code))}
end
end
end
end
我在机场和飞行模型之间建立了多对多关系,参考 (foreign_key) 如下;
class Airport < ApplicationRecord
has_many :departures,
class_name: :Flight,
foreign_key: :origin_id,
dependent: :destroy
has_many :arrivals,
class_name: :Flight,
foreign_key: :destination_id,
dependent: :destroy
end
class Flight < ApplicationRecord
belongs_to :origin, class_name: :Airport
belongs_to :destination, class_name: :Airport
end
这是数据库模式;
ActiveRecord::Schema.define(version: 2021_07_21_232515) do
create_table "airports", force: :cascade do |t|
t.string "code"
t.string "location"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "flights", force: :cascade do |t|
t.integer "origin_id", null: false
t.integer "destination_id", null: false
t.integer "duration"
t.datetime "flight_schedule"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["destination_id"], name: "index_flights_on_destination_id"
t.index ["origin_id"], name: "index_flights_on_origin_id"
end
add_foreign_key "flights", "destinations"
add_foreign_key "flights", "origins"
end
当我运行railsdb:seed
我有这些错误:
Rails aborted!
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.destinations
Rails 版本 6.1.4
Ruby 版本 3.0.1p64(2021-04-05 修订版 0fb782ee38)[x86_64-linux]
架构看起来不正确,add_foreign_key
应该是这样的
add_foreign_key "flights", "airports", column: "destination_id"
add_foreign_key "flights", "airports", column: "origin_id"
所以我猜你的迁移不正确,你应该检查那些相对于添加 references
和 foreign_key
到 flights
table 的迁移,它应该如下所示:
create_table :flights do |t|
# ...
t.belongs_to :origin, null: false
t.belongs_to :destination, null: false
# ...
t.foreign_key :airports, column: :origin_id
t.foreign_key :airports, column: :destination_id
end
我正在尝试通过 rails ActiveRecord 中 sqlit3 数据库上的 seed.rb 文件填充航班 table,代码如下:
departure = Date.new(2021, 9, 1)
arrival = Date.new(2021, 10, 1)
(departure).upto(arrival).each do |flight_schedule|
airports.each do |origin|
airports.each do |destination|
if origin == destination
next
else
3.times { Flight.create(origin: origin,
destination: destination,
flight_schedule: flights_time,
duration: flights_duration(origin.code, destination.code))}
end
end
end
end
我在机场和飞行模型之间建立了多对多关系,参考 (foreign_key) 如下;
class Airport < ApplicationRecord
has_many :departures,
class_name: :Flight,
foreign_key: :origin_id,
dependent: :destroy
has_many :arrivals,
class_name: :Flight,
foreign_key: :destination_id,
dependent: :destroy
end
class Flight < ApplicationRecord
belongs_to :origin, class_name: :Airport
belongs_to :destination, class_name: :Airport
end
这是数据库模式;
ActiveRecord::Schema.define(version: 2021_07_21_232515) do
create_table "airports", force: :cascade do |t|
t.string "code"
t.string "location"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "flights", force: :cascade do |t|
t.integer "origin_id", null: false
t.integer "destination_id", null: false
t.integer "duration"
t.datetime "flight_schedule"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["destination_id"], name: "index_flights_on_destination_id"
t.index ["origin_id"], name: "index_flights_on_origin_id"
end
add_foreign_key "flights", "destinations"
add_foreign_key "flights", "origins"
end
当我运行railsdb:seed 我有这些错误:
Rails aborted!
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.destinations
Rails 版本 6.1.4 Ruby 版本 3.0.1p64(2021-04-05 修订版 0fb782ee38)[x86_64-linux]
架构看起来不正确,add_foreign_key
应该是这样的
add_foreign_key "flights", "airports", column: "destination_id"
add_foreign_key "flights", "airports", column: "origin_id"
所以我猜你的迁移不正确,你应该检查那些相对于添加 references
和 foreign_key
到 flights
table 的迁移,它应该如下所示:
create_table :flights do |t|
# ...
t.belongs_to :origin, null: false
t.belongs_to :destination, null: false
# ...
t.foreign_key :airports, column: :origin_id
t.foreign_key :airports, column: :destination_id
end