Использовать полиморфную ассоциацию для определения принадлежности? Или я должен оставить пустой столбец на столе? - PullRequest
0 голосов
/ 06 июля 2018

Я работал над проблемой и не могу решить, требует ли решение полиморфной ассоциации или просто имеет пустой столбец в моей таблице.

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

Итак, у меня есть модели «Подарок», «Пользователь» и «Коллектив», а также модель «Таблица присоединения к членству».

Коллектив имеет много членов и много пользователей через членство; пользователь (может) имеет много членств и много коллективов через членство; и подарок должен принадлежать пользователю или коллективу. Это где я запутался.

Моим первым подходом было создание полиморфной ассоциации с классом Donation

class Donations < ActiveRecord::Base
  belongs_to :donor, polymorphic: true
  belongs_to :gift
end

с таблицей на схеме, похожей на:

create_table "donations" do |t|
  t.integer "donor_id"
  t.string "donor_type"
  t.integer "gift_id"
end

что означало бы, что мой Коллективный класс будет выглядеть так:

class Collective < ActiveRecord::Base
  has_many :donations, as: :donor
  has_many :gifts, through: :donations 
  has_many :memberships
  has_many :users, through: :memberships
 end

и мой класс User будет выглядеть как

class User < ActiveRecord::Base
  has_many :donations, as: :donor
  has_many :gifts, through: :donations 
  has_many :memberships
  has_many :collectives, through: :memberships
 end

но когда я делаю урок по дарам, к чему он должен принадлежать?

class Gift < ActiveRecord:Base
  belongs_to :donor #???
  ##has_one :donor, through: :donation??
end

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

Мне интересно, не проще ли было бы иметь два столбца в моей базе данных, оставляя один пустой бланк путем проверки в зависимости от того, было ли пожертвование сделано коллективом или частным лицом. Или это потенциально хороший пример полезности полиморфных ассоциаций?

Спасибо!

1 Ответ

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

Да, так получается, что этот способ работает. Я упросту то, чему научился, следуя статье, на которую я ссылался в предыдущем комментарии.

Моя модель выглядит так:

class Donation < ApplicationRecord
 belongs_to :donor, polymorphic: true
 belongs_to :gift
end

Теперь нам нужно создать новый экземпляр Donation. Вот как я их назначил:

soccer_team = Collective.new(name: "Hamilton High Soccer Team")

tony = User.new(name: "Tony")

christmas_from_tony = Gift.new
christmas_from_soccer_team = Gift.new

christmas_donation_from_tony = Donation.new(donor_id: tony.id, donor_type: tony.class.name, gift_id: christmas_from_tony.id)
christmas_donation_from_soccer_team = Donation.new(donor_id: soccer_team.id, donor:type: soccer_team.class.name, gift_id: christmas_from_soccer_team.id)

Так что теперь я могу позвонить

tony.donations.first.gift

girlscouts.donations.first.gift

и получите каждый отдельный экземпляр подарка!

Не совсем точно, когда я буду использовать «донора» в этом случае, потому что в подарке всегда будет только один донор.

Но я заставил его работать на то, что я хотел!

...