Ruby on Rails ActiveRecord - ошибки в отношениях - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в рельсах и следовал ряду руководств по различным онлайн-курсам и использую другие вопросы переполнения стека, чтобы сгенерировать некоторые модели (континент, страна, штат) со ссылками и попытаться начать создавать некоторые экземпляры и тестировать их.

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

До

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 должен быть единственным, в данном случае континентом и неконтинентами.

0 голосов
/ 19 сентября 2018

В вашей модели страны у вас есть:

belongs_to :continents

Поскольку belongs_to обозначает особые отношения (т. Е. Страна может принадлежать только одному континенту), вам необходимо изменить это значение на

belongs_to :continent

Тогда Rails должен начать правильно назначать континент.

...