Я работал над проблемой и не могу решить, требует ли решение полиморфной ассоциации или просто имеет пустой столбец в моей таблице.
Допустим, я делаю сайт по сбору средств, и пожертвования можно делать как индивидуально, так и коллективно. Мой сайт не будет различать коллективные и индивидуальные учетные записи пользователей; Пользователь может объединиться в коллективы и принимать решения о пожертвовании денег на основе консенсуса или свободно отдавать их по своему усмотрению.
Итак, у меня есть модели «Подарок», «Пользователь» и «Коллектив», а также модель «Таблица присоединения к членству».
Коллектив имеет много членов и много пользователей через членство; пользователь (может) имеет много членств и много коллективов через членство; и подарок должен принадлежать пользователю или коллективу. Это где я запутался.
Моим первым подходом было создание полиморфной ассоциации с классом 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
По результатам исследований, кажется, что полиморфные ассоциации обычно используются для более мелких функций, таких как заметки или комментарии. Обычно объект уже явно принадлежит, а принадлежащий объект обычно связан с чем-то, что обычно имеет отношение «многие ко многим».
Мне интересно, не проще ли было бы иметь два столбца в моей базе данных, оставляя один пустой бланк путем проверки в зависимости от того, было ли пожертвование сделано коллективом или частным лицом. Или это потенциально хороший пример полезности полиморфных ассоциаций?
Спасибо!