ActiveRecord NoMethodError при попытке доступа к коллекции has_many - PullRequest
1 голос
/ 10 июля 2020

У меня есть модели, представляющие континент, страну, штат, округ и город, и по какой-то причине я могу получить доступ к некоторым коллекциям, но не к другим.

У меня есть эти модели:

class Continent < ApplicationRecord
 has_many :countries
end

class Country < ApplicationRecord
  belongs_to :continent
  has_many :states
  validates :continent, presence: true
end

class State < ApplicationRecord
  belongs_to :country
  has_many :counties
  validates :country, presence: true
end

class County < ApplicationRecord
  belongs_to :state
  has_many :cities
  validates :state, presence: true
end

class City < ApplicationRecord
  belongs_to :county
  validates :county, presence: true
end

Моя схема выглядит следующим образом (без временных меток):

 create_table "counties", force: :cascade do |t|
    t.string "name"
    t.bigint "state_id", null: false
    t.index ["state_id"], name: "index_counties_on_state_id"
  end

  create_table "continents", force: :cascade do |t|
    t.string "name"
  end

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

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

  create_table "cities", force: :cascade do |t|
    t.string "name"
    t.bigint "city_id", null: false
    t.index ["county_id"], name: "index_cities_on_county_id"
  end

  add_foreign_key "counties", "states"
  add_foreign_key "countries", "continents"
  add_foreign_key "states", "countries"
  add_foreign_key "cities", "counties"
end

Работают следующие запросы:

Continent.first.countries работает и возвращает коллекцию стран. Continent.first.countries[0].states работает и возвращает набор состояний.

Больше ничего не работает, и я не могу получить доступ к другим подколлекциям. Например:

Continent.first.countries[0].states[0].counties

Он возвращает:

NoMethodError (undefined method графства для #State: 0x00007fafc28d4180) `

ИЛИ, если я использую FIND, чтобы получить конкретный c округ, я все еще не могу получить доступ к коллекции городов.

Для пояснения, у меня есть записи в базе данных для всех сущностей. Например, рекорд Калифорнии - #<State id: 331, country_id: 4, created_at: "2020-07-09 19:57:32", updated_at: "2020-07-09 19:57:32"> и рекорд округа Ориндж - #<County id: 742, name: "Orange County", state_id: 331, created_at: "2020-07-09 19:57:32", updated_at: "2020-07-09 19:57:32">. Но попытка cali = State.find(331) дает рекорд Калифорнии, а cali.counties дает NoMethodError.

Что я упускаю из виду или делаю неправильно?

Почему я могу получить доступ к некоторым, но не к другим?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 10 июля 2020

Похоже, у вас нет записи в Continent.first.countries[0].states[0], поэтому вы получаете ошибку NoMethodError (undefined method counties' for #State:0x00007fafc28d4180).

Попробуйте вставить образец записи в State и выполните State.first.counties, если это работает.

...