Rails унифицировала постоянную ошибку во многих отношениях - PullRequest
0 голосов
/ 01 июля 2018

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

Пока у меня есть приведенный ниже код с тремя вышеупомянутыми моделями плюс таблица соединений. У меня проблема в том, что всякий раз, когда я пытаюсь получить доступ к user.products, например, я получаю ошибку uninitialized constant Order::ProductOrder, или если я пытаюсь product.orders, я получаю uninitialized constant Product::Orders.

Кто-нибудь будет так любезен, чтобы поделиться своим опытом в решении этой проблемы?

class Order < ApplicationRecord
  belongs_to :user
  has_many :product_orders
  has_many :products, through: :product_orders
end

class Product < ApplicationRecord
  has_many :product_orders, class_name: 'ProductOrders'
  has_many :orders, through: :product_orders
  has_many :users, through: :orders
end

class User < ApplicationRecord
  has_many :orders
  has_many :products, through: :orders
end

class ProductOrders < ApplicationRecord
  belongs_to :orders
  belongs_to :products
end

Схема БД:

  create_table "orders", force: :cascade do |t|
    t.datetime "fulfilled_date"
    t.integer "quantity"
    t.integer "total"
    t.bigint "user_id"
    t.index ["user_id"], name: "index_orders_on_user_id"
  end

  create_table "product_orders", force: :cascade do |t|
    t.bigint "product_id"
    t.bigint "order_id"
    t.index ["order_id"], name: "index_product_orders_on_order_id"
    t.index ["product_id"], name: "index_product_orders_on_product_id"
  end

  create_table "products", force: :cascade do |t|
    t.string "image_url"
    t.string "name"
    t.string "description"
    t.integer "inventory", default: 0
    t.integer "price"
    t.bigint "order_id"
    t.bigint "user_id"
    t.index ["order_id"], name: "index_products_on_order_id"
    t.index ["user_id"], name: "index_products_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "address"
    t.string "state"
    t.string "zip"
    t.string "phone_number"
    t.string "country"
  end

1 Ответ

0 голосов
/ 01 июля 2018

Требуется пара исправлений:

добавить class_name для :product_orders в Order;

class Order < ApplicationRecord
  belongs_to :user
  has_many :product_orders, class_name: 'ProductOrders'
  has_many :products, through: :product_orders
end

belongs_to должно иметь единственное число order и product:

class ProductOrders < ApplicationRecord
  belongs_to :order
  belongs_to :product
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...