Дилемма между двумя схемами базы данных для моего проекта рельсов рынка - PullRequest
0 голосов
/ 12 сентября 2018

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

В настоящее время я использую эту схему.

  ActiveRecord::Schema.define(version: 2018_09_11_202223) do

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

  create_table "orders", force: :cascade do |t|
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_orders_on_user_id"
  end

  create_table "orders_products", id: false, force: :cascade do |t|
    t.integer "order_id", null: false
    t.integer "product_id", null: false
    t.index ["order_id", "product_id"], name: "index_orders_products_on_order_id_and_product_id"
    t.index ["product_id", "order_id"], name: "index_orders_products_on_product_id_and_order_id"
  end

  create_table "products", force: :cascade do |t|
    t.string "name"
    t.string "tagline"
    t.integer "user_id"
    t.integer "category_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "price"
    t.text "description"
    t.index ["category_id"], name: "index_products_on_category_id"
    t.index ["user_id"], name: "index_products_on_user_id"
  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.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    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

end

С этими моделями:

class Category < ApplicationRecord
  has_many :products
end

class Order < ApplicationRecord
  has_and_belongs_to_many :products
  belongs_to :user
end

class Product < ApplicationRecord
  has_and_belongs_to_many :orders
  belongs_to :category
  belongs_to :user
end

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :orders, :dependent => :destroy
  has_many :products, :dependent => :destroy
end

Так что в основномя собираюсь использовать HABTOM (has_and_belongs_to_many) ассоциации между таблицей Orders и Products, как вы можете видеть в моих моделях, потому что в заказе может быть много продуктов, а продукт может быть во многих заказах (здесь я не уверен, xD,я думаю, что я не прав).Во всяком случае, моя дилемма заключается в следующем, так как я читал в Интернете, что в большинстве случаев в таких ситуациях вы можете использовать has_many: through association (HMTA), что-то вроде этого:

class Category < ApplicationRecord
  has_many :products
end

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

class Order
  belongs_to :user
  belongs_to :product
end

class Product
  belongs_to :category
  has_many :orders
  has_many :users, through: :orders
end

помните, что на моем рынке я хочу, чтобы люди могли как покупать, так и продавать, поэтому у пользователя может быть много продуктов, но продукт должен быть уникальным и принадлежать только одному конкретному пользователю , например,старая машина, не существует двух абсолютно идентичных машин, поэтому я использовал эту ассоциацию в своей модели Продукта:

class Product < ApplicationRecord
  has_and_belongs_to_many :orders
  belongs_to :category
  belongs_to :user
end

Итак, в конце концов, что вы предлагаете мне сделать?я должен переключиться с ассоциации HABTOM на HMTA?В этом случае, скажем, я хочу продать продукт, как я могу управлять ассоциацией пользователей и продуктов?Можно ли просто использовать has_many: через ассоциацию?Спасибо

1 Ответ

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

продукт должен быть уникальным и принадлежать только одному конкретному пользователю

Дело в том, что между таблицей products и таблицей users должно быть две ссылки.

Вам нужно понятие «продавец», а также «покупатель» (или как вы его называете).

Примерно так:

class Product < ApplicationRecord
  belongs_to :seller, class_name: "User"
  has_many :buyers, through: :orders, class_name: "User"
end

class User
  has_many :orders
  has_many :products_bought, through: :orders, class_name: 'Product'
  has_many :products_sold, class_name: 'Product'
end

Затем можно добавить проверку уникальности продукта (возможно, в область действия seller_id?).

Если бы у одного продукта было несколько продавцов, то вы могли бы немного настроить эту связь, чтобы использовать более общую таблицу соединений (т.е. переименовать таблицу orders). Но вам все еще нужно четкое различие между «продавцами» и «покупателями».

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