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 必须是单数,在本例中是大陆和非大陆。
我是 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 必须是单数,在本例中是大陆和非大陆。