Связи модели Rails - has_one или наследование одной таблицы? - PullRequest
1 голос
/ 20 апреля 2020

У меня проблемы с выбором между наследованием одной таблицы и простым отношением has_one для двух моих моделей.

Справочная информация: я создаю сайт для ставок с моделью "Ставка". Пользователи могут создавать ставки, после чего они отображаются всем пользователям, которые могут принять ставки, если они того пожелают. Модель ставок имеет перечисление с тремя статусами: создано, принято и завершено.

Теперь я хочу добавить функцию «Любимое пари». Смысл этого в том, чтобы пользователям было удобнее создавать ставки, если они есть, которые они обычно создают. Один щелчок вместо десяти.

Любимые пользователи существуют только в виде сохраненного проекта. Это просто детали ставки - когда пользователь хочет создать ставку, он может просмотреть FavoriteWager и щелкнуть «создать», чтобы получить все поля FavoriteWager и создать с ними пари. Таким образом, разница в том, что FavoriteWager действует только как хранилище для Wager, а также включает в себя имя, указанное пользователем.

Я прочитал о STI, и кажется, что во многих примерах есть несколько подклассов - например, , Автомобиль, Мотоцикл, Лодка для класса «Автомобиль». Тогда как у меня не будет нескольких подклассов, только один (FavoriteWager

С другой стороны, has_one, похоже, неправильно отражает отношения. Вот пример:

Class User < ApplicationRecord
  has_many :favorite_wagers, dependent: :destroy
  has_many :wagers, dependent: destroy
end

Class FavoriteWager < ApplicationRecord
  has_one :wager
  belongs_to: user, index: true, foreign_key: true
end

Class Wager < ApplicationRecord
  belongs_to :favorite_wager, optional: true
  belongs_to :user
end

Я также думал о прямом копировании полей, но это не очень DRY. Добавление перечисления с параметром «черновик» кажется слишком небольшим, потому что в будущем мне может понадобиться добавить больше полей (например, время для автоматического создания), после чего оно начнет превращаться во что-то другое. Мысли о том, как подойти к этому?

1 Ответ

0 голосов
/ 20 апреля 2020

Почему бы просто не создать таблицу соединения, например:

Class User < ApplicationRecord
  has_many :favorite_wagers, dependent: :destroy
  has_many :wagers, through: :favorite_wagers
end


Class FavoriteWager < ApplicationRecord
  belongs_to :wager, index: true, foreign_key: true
  belongs_to :user, index: true, foreign_key: true
end

Class Wager < ApplicationRecord
  has_one :favorite_wager, dependent: destroy
  has_one :user, through: :favorite_wager
end

Ваш FavoriteWager будет иметь следующие поля:

|user_id|wager_id|name|

Таким образом, вы сможете получить к нему доступ как:

some_user.favorite_wagers
=> [#<FavoriteWager:0x00007f9adb0fa2f8...

some_user.favorite_wagers.first.name
=> 'some name'

some_user.wagers.first.amount
=> '$10'

some_user.wagers.first.favorite_wager.name
=> 'some name'

, который возвращает массив любимых ставок. Если вы хотите иметь ОДНУ любимую ставку на пользователя, вы можете настроить ее, чтобы ограничить это. Но это дает вам возможность связать пари и пользователей в избранное с атрибутом имени. Я не совсем понимаю ваш вариант использования «ставки в реальном времени никогда не будет любимым», но это не имеет значения, вы можете настроить его под свои нужды.

...