Лучший способ настроить Datamodel или Schema Relationship, используя Ruby-on-Rails и Activerecord - PullRequest
0 голосов
/ 21 января 2019

Я создаю веб-приложение, которое позволяет пользователю track/log его транспортное средство restoration/maintenance расходы на выделенные часы и приобретенные детали. Мне нужна помощь в настройке схемы базы данных и модели отношений правильно. Пожалуйста, имейте в виду, хотя я понимаю, что это можно упростить, мне нужно как минимум 5 моделей для этого задания.

Вот что я придумала до сих пор. (VSP на изображении - сокращение от Vehicle_Service_Part, которое предназначено для связи «таблицы атрибутов 3 ID» между моделями Vehicle, Service и Part.) Хотя это не показано в коде схемы, каждый класс будет создан автоматически со своим уникальным первичным ключом :id. Мне не хватает 2 баллов для возможности публикации изображений ... см. Модели данных на ссылке

Вот моя схема рельсов:

ActiveRecord::Schema.define(version: 2019_01_21_042407) do
  create_table "owners", force: :cascade do |t|
    t.string "name"
    t.string "street"
    t.string "city"
    t.string "state"
    t.integer "zip"
    t.string "phone_number"
    t.string "email"
  end

  create_table "parts", force: :cascade do |t|
    t.string "part_number"
    t.string "part_name"
    t.integer "cost"
    t.string "part_type"
    t.integer "quantity"
  end

  create_table "services", force: :cascade do |t|
    t.string "date"
    t.string "work_description"
    t.integer "car_miles"
    t.integer "work_hours"
  end

  create_table "vehicle_service_parts", force: :cascade do |t|
    t.integer "vehicle_id"
    t.integer "service_id"
    t.integer "part_id"
  end

  create_table "vehicles", force: :cascade do |t|
    t.string "make"
    t.string "model"
    t.integer "year"
    t.string "vin"
    t.string "engine"
    t.string "car_type"
    t.string "color"
  end

  create_table "vendors", force: :cascade do |t|
    t.string "name"
    t.string "contact"
    t.string "website"
    t.string "location"
  end
end

А вот мои модельные отношения:

class Owner < ApplicationRecord
    has_many :vehicles
    has_many :vehicle_service_parts, through: :vehicles
end

class Vehicle < ApplicationRecord
    belongs_to :owner
    has_many :vehicle_service_parts
    has_many :services, through: :vehicle_service_parts
    has_many :parts, through: :vehicle_service_parts
end

class Service < ApplicationRecord
    has_many :vehicle_service_parts
    has_many :vehicles, through: :vehicle_service_parts
    has_many :parts, through: :vehicle_service_parts
end

class Part < ApplicationRecord
    belongs_to :vendor
    has_many :vehicle_service_parts
    has_many :vehicles, through: :vehicle_service_parts
    has_many :services, through: :vehicle_service_parts
end

class VehicleServicePart < ApplicationRecord
    belongs_to :vehicle
    belongs_to :service
    belongs_to :part
    has_many :owners, through: :vehicles
    has_many :owners, through: :parts
end

class Vendor < ApplicationRecord
    has_many :parts
    has_many :vehicle_service_parts, through: :parts
end

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

  1. Владельцы могут иметь несколько транспортных средств с разными наборами записей.

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

  3. Класс модели Part содержит атрибут :part_type, которому будет назначена строка из категоризированного списка, включая, но не ограничиваясь, "двигатель", "подвеска", "тормоза" ... и т. Д. позволяя зрителю увидеть все общие части / затраты / часы / услуги :part_type "engine" данного транспортного средства.

  4. Когда зритель создает новый Service, я хотел бы иметь возможность создать новый экземпляр класса Part с данными атрибутов перспективы, которые будут вводиться через формы и затем добавляться в базу данных.

  5. Можно ли выполнить 4. при создании / добавлении нескольких частей в рамках одной услуги? Например, замена масла будет считаться одним экземпляром класса Service, однако будет связана с несколькими экземплярами класса Part, включая экземпляр масляного фильтра и экземпляр масла. И масляный фильтр, и масло - это две разные части, но размещенные в рамках одного обслуживания.

  6. Зритель может увидеть все различные детали, обслуживаемые на их автомобиле, а также общие расходы.

  7. Зритель может видеть всех поставщиков, у которых были куплены запчасти для их автомобилей.

Буду очень признателен за любую помощь, направление или совет!

1 Ответ

0 голосов
/ 21 января 2019

Мое предложение для вас будет разработать базу данных, как показано ниже:

  1. владельцы -> has_many -> транспортные средства

    владельцев <- принадлежит_ к <- транспортным средствам </p>

  2. автомобили -> has_many -> запчасти

    транспортных средств <- own_to <- запчасти (здесь, в зависимости от вашего варианта использования, транспортные средства и запчасти также могут иметь много ко многим. Возможно, вам придется использовать отношения has_and_belongs_to_many) </p>

  3. запчасти -> has_many -> услуги

    услуги <- принадлежат_ <<запчасти </p>

Что касается вашего 4-го пункта, да, вы можете достичь этого с помощью концепции acceptpts_nested_attributes_for. В форме «Создание службы» вы можете добавлять поля для деталей. Следуйте инструкциям здесь https://www.sitepoint.com/complex-rails-forms-with-nested-attributes/

...