Я новичок в рельсах и следовал ряду руководств по различным онлайн-курсам и использую другие вопросы переполнения стека, чтобы сгенерировать некоторые модели (континент, страна, штат) со ссылками и попытаться начать создавать некоторые экземпляры и тестировать их.
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
Наконец, я начинаю добавлять некоторые тесты для использования.в семенах и консоли.Добавление континента работает, как это просто, однако запуск Country.create (имя: "Australia", continent: Continent.find_by (name: "Oceania")) не создает отношения между Континентом и страной (Continent_id равен нулю вСтрана).
Однако я могу запустить только Continent.find_by (имя: «Океания») и получить:
=> Идентификатор континента: 10, имя: «Океания», create_at: "2018-09-19 09:18:07", updated_at: "2018-09-19 09:18:07"
У меня такое ощущение, что я на правильном пути, ноперепутали несколько вещей между исправлением нескольких решений / методов.Возможно, я использую генераторы неправильно или аналогично, возможно, смешивая некоторые ручные методы с тем, что я должен позволить генераторам обрабатывать.Если кто-то может помочь заполнить пробелы, которые будут оценены.Вот схема.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