首页 > 解决方案 > 无法使用 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 []>

标签: ruby-on-rails

解决方案


您的模型文件中有错误。验证用符号指定,符号以:您省略的字符开头。它们应该如下所示:

class State < ApplicationRecord
  validates :country_code, presence: true
  validates :name, presence: true, uniqueness:true
end

推荐阅读