has_many через отношения выбрасывает NoMethodError - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблемы с доступом к user.regions через user.preferences.regions

Вот мой класс Preference (не обращайте внимания на путаницу между единственными / множественными предпочтениями, я об этом позаботился)

class Preference < ApplicationRecord
  belongs_to :user

  has_many :preference_regions
  has_many :regions, through: :preference_regions

  has_many :preference_home_airports
  has_many :home_airports, through: :preference_home_airports, source: :airport

  has_many :vacations
  accepts_nested_attributes_for :vacations  
end

А вот мой User класс

require_relative './user/omniauth'

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  devise :omniauthable, omniauth_providers: %i[facebook]

  has_one :preferences, class_name: "Preference"
  has_many :vacations, through: :preferences
  has_many :regions, through: :preferences
  has_many :home_airports, through: :preferences

  after_create do |user|  
    user.preferences = Preference.create
  end
end

Я подумал, что это может иметь какое-то отношение к тому факту, что preferences.regions много-ко-многим, но user.home_airportsеще один, многие-ко-многим через отношения, прекрасно работает.

Есть идеи?

PS.Вот относительные части моей схемы:

ActiveRecord::Schema.define(version: 2019_02_05_181942) do
  create_table "preference_home_airports", force: :cascade do |t|
    t.bigint "preference_id"
    t.bigint "airport_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["airport_id"], name: "index_preference_home_airports_on_airport_id"
    t.index ["preference_id"], name: "index_preference_home_airports_on_preference_id"
  end

  create_table "preference_regions", force: :cascade do |t|
    t.bigint "preference_id"
    t.bigint "region_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["preference_id"], name: "index_preference_regions_on_preference_id"
    t.index ["region_id"], name: "index_preference_regions_on_region_id"
  end

  create_table "preferences", force: :cascade do |t|
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

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

  create_table "user_airports", force: :cascade do |t|
    t.integer "user_id"
    t.integer "airport_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "user_regions", force: :cascade do |t|
    t.integer "user_id"
    t.integer "region_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "provider"
    t.string "uid"
    t.string "first_name"
    t.string "last_name"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

  create_table "vacations", force: :cascade do |t|
    t.string "name"
    t.date "start_date"
    t.date "end_date"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "preference_id"
  end

  add_foreign_key "deal_origins", "airports"
  add_foreign_key "deal_origins", "deals", on_delete: :cascade
  add_foreign_key "preference_home_airports", "airports"
  add_foreign_key "preference_home_airports", "preferences", column: "preference_id"
  add_foreign_key "preference_regions", "preferences", column: "preference_id"
  add_foreign_key "preference_regions", "regions"
end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...