Ruby Rails ActiveRecord - 发生关系错误

Ruby on Rails ActiveRecord - making relationships errors

我是 rails 的新手,已经遵循了各种在线课程的许多指南,并使用其他 Stack Overflow 问题生成了一些带有参考的模型(大陆、国家、州),并尝试开始制作一些模型实例并对其进行测试。

rails g model Continent name:string
rails g model Country name:string continent:reference
rails g model State name:string country:reference

我不记得我是按什么顺序制作的。但我不得不在模型文件夹中手动添加以下内容。

class Continent < ApplicationRecord
    has_many :countries
    has_many :states, through: :countries
    has_many :regions, through: :states
end


class Country < ApplicationRecord
    belongs_to :continents, optional: true
    has_many :states
    has_many :regions, through: :states
end


class State < ApplicationRecord
  belongs_to :country, , optional: true
  has_one :continent, through: :country
  has_many :regions
end

class Region < ApplicationRecord
  belongs_to :state, optional: true
  has_one :country, through: :state
  has_one :continent, through: :country

最后,我开始添加一些测试以在种子和控制台中使用。添加大陆很简单,但是 运行ning Country.create(name:"Australia", continent: Continent.find_by(name: "Oceania")) 不建立Continent和Country之间的关系(Continent_id在Country中为nil)。

但是,我可以 运行 仅 Continent.find_by(name: "Oceania") 并得到:

=> Continent id: 10, name: "Oceania", created_at: "2018-09-19 09:18:07", updated_at: "2018-09-19 09:18:07"

我觉得自己走在正确的轨道上,但在将多个 solutions/methods 拼凑在一起时混淆了一些东西。我可能使用了错误或类似的生成器,可能将一些手动方法与我应该让生成器处理的东西混在一起。如果有人可以帮助填补空白,我们将不胜感激。这是 schema.rb

ActiveRecord::Schema.define(version: 2018_09_13_044538) do

  create_table "continents", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "countries", force: :cascade do |t|
    t.string "name"
    t.integer "continent_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["continent_id"], name: "index_countries_on_continent_id"
  end

  create_table "states", force: :cascade do |t|
    t.string "name"
    t.integer "country_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["country_id"], name: "index_states_on_country_id"
  end

在您的国家模型中,您有:

belongs_to :continents

由于belongs_to表示单数关系(即一个国家只能属于一个大陆),需要改成

belongs_to :continent

然后Rails应该开始正确分配大陆了。

之前

class Country < ApplicationRecord belongs_to :continents, optional: true has_many :states has_many :regions, through: :states end

之后

class Country < ApplicationRecord belongs_to :continent, optional: true has_many :states has_many :regions, through: :states end

Belongs_to 必须是单数,在本例中是大陆和非大陆。