ruby-on-rails - 无法使用 rails db:seed 创建数据
问题描述
我无法创建种子数据
docker-compose 运行 app rails db:seed
命令
这是错误信息
docker-compose run app rails db:seed
Creating toei-works_app_run ... done
rails aborted!
NameError: undefined local variable or method `country_code' for State (call 'State.connection' to establish a connection):Class
/usr/local/bundle/gems/activerecord-6.0.3.5/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
/app/app/models/state.rb:4:in `<class:State>'
/app/app/models/state.rb:3:in `<top (required)>'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/usr/local/bundle/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb:26:in `require'
/app/db/seeds.rb:2:in `<top (required)>'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/engine.rb:557:in `block in load_seed'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/engine.rb:675:in `with_inline_jobs'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/engine.rb:557:in `load_seed'
/usr/local/bundle/gems/activerecord-6.0.3.5/lib/active_record/tasks/database_tasks.rb:440:in `load_seed'
/usr/local/bundle/gems/activerecord-6.0.3.5/lib/active_record/railties/databases.rake:331:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-6.0.3.5/lib/rails/commands.rb:18:in `<top (required)>'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/app/bin/rails:9:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.1/lib/spring/client/rails.rb:28:in `load'
/usr/local/bundle/gems/spring-2.1.1/lib/spring/client/rails.rb:28:in `call'
/usr/local/bundle/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call'
/usr/local/bundle/gems/spring-2.1.1/lib/spring/client.rb:30:in `run'
/usr/local/bundle/gems/spring-2.1.1/bin/spring:49:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `load'
/usr/local/bundle/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `<top (required)>'
/app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
我不知道如何解决这个错误
NameError: 未定义的局部变量或方法 `country_code' for State(调用 'State.connection' 建立连接):Class
这是我要制作种子数据的州表。
create_table "states", id: :uuid, default: -> { "gen_random_uuid()" }, comment: "state",
force: :cascade do |t|
t.string "country_code", null: false, comment: "country's code(number)"
t.string "name", null: false, comment: "city name"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["name"], name: "index_states_on_name", unique: true
end
种子.rb
# frozen_string_literal: true
State.create!(
[
{ country_code: 392, name: '北海道' }, { country_code: 392, name: '青森県' }, { country_code: 392, name: '岩手県' },
{ country_code: 392, name: '宮城県' }, { country_code: 392, name: '秋田県' }, { country_code: 392, name: '山形県' },
{ country_code: 392, name: '福島県' }, { country_code: 392, name: '茨城県' }, { country_code: 392, name: '栃木県' },
{ country_code: 392, name: '群馬県' }, { country_code: 392, name: '埼玉県' }, { country_code: 392, name: '千葉県' },
{ country_code: 392, name: '東京都' }, { country_code: 392, name: '神奈川県' }, { country_code: 392, name: '新潟県' },
{ country_code: 392, name: '富山県' }, { country_code: 392, name: '石川県' }, { country_code: 392, name: '福井県' },
{ country_code: 392, name: '山梨県' }, { country_code: 392, name: '長野県' }, { country_code: 392, name: '岐阜県' },
{ country_code: 392, name: '静岡県' }, { country_code: 392, name: '愛知県' }, { country_code: 392, name: '三重県' },
{ country_code: 392, name: '滋賀県' }, { country_code: 392, name: '京都府' }, { country_code: 392, name: '大阪府' },
{ country_code: 392, name: '兵庫県' }, { country_code: 392, name: '奈良県' }, { country_code: 392, name: '和歌山県' },
{ country_code: 392, name: '鳥取県' }, { country_code: 392, name: '島根県' }, { country_code: 392, name: '岡山県' },
{ country_code: 392, name: '広島県' }, { country_code: 392, name: '山口県' }, { country_code: 392, name: '徳島県' },
{ country_code: 392, name: '香川県' }, { country_code: 392, name: '愛媛県' }, { country_code: 392, name: '高知県' },
{ country_code: 392, name: '福岡県' }, { country_code: 392, name: '佐賀県' }, { country_code: 392, name: '長崎県' },
{ country_code: 392, name: '熊本県' }, { country_code: 392, name: '大分県' }, { country_code: 392, name: '宮崎県' },
{ country_code: 392, name: '鹿児島県' }, { country_code: 392, name: '沖縄県' },
{ country_code: 840, name: 'ニューヨーク' }, { country_code: 840, name: 'ロサンゼルス' }, { country_code: 840, name: 'シカゴ' },
{ country_code: 156, name: '北京市' }, { country_code: 410, name: 'ソウル' }, { country_code: 702, name: 'シンガポール' }
]
)
为什么我不能制作种子数据?
应用程序/模型/state.rb
# frozen_string_literal: true
# City
class State < ApplicationRecord
validates country_code, presence: true
validates name, presence: true, uniqueness:true
end
虽然我不知道它是否相关,但我在确认 rails console 时确认了神秘的行为。
rails 控制台的日志
irb(main):001:0> State.all
Traceback (most recent call last):
3: from (irb):1
2: from app/models/state.rb:3:in `<top (required)>'
1: from app/models/state.rb:4:in `<class:State>'
NameError (undefined local variable or method `country_code' for State (call 'State.connection' to establish a connection):Class)
irb(main):002:0> State.all
State Load (7.5ms) SELECT "states".* FROM "states" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
为什么会出现 NameError?
irb(main):001:0> State.all Traceback(最近一次调用最后):3:来自(irb):1 2:来自app/models/state.rb:3:in
<top (required)>' 1: from app/models/state.rb:4:in
class:State' NameError(未定义本地State 的变量或方法“country_code”
为什么不是第二次出现名称错误?
irb(main):003:0> State.all State Load (1.0ms) SELECT "states".* FROM "states" LIMIT $1 [["LIMIT", 11]] => #<ActiveRecord::Relation []>
解决方案
您的模型文件中有错误。验证用符号指定,符号以:
您省略的字符开头。它们应该如下所示:
class State < ApplicationRecord
validates :country_code, presence: true
validates :name, presence: true, uniqueness:true
end
推荐阅读
- neo4j - 在关系边上过滤查询 N 跳的路径
- java - 休眠异常,“意外的 AST 节点”
- bash - 尝试运行脚本时在我的苹果终端中获取代码:'UNABLE_TO_VERIFY_LEAF_SIGNATURE'}'Uncaught Exception throw'
- javascript - 有没有办法在 pwa 中安排离线通知?
- influxdb - 在 InfluxDB 中存储统计数据
- java - Spring security:如果用户不满足特定条件,则使每个页面重定向
- tabulator - 制表器 - 甚至无法通过快速入门开始
- ravendb - DllNotFoundException:在 Windows 7 x64 上启动 RavenDB 4.2 时无法加载 DLL 'librvnpal'。如何纠正这个?
- android - 为什么我的应用程序即使具有必要的权限也无法发送短信?
- firemonkey - 将 TImage 转换为黑白