我一直在研究一个问题,无法确定该解决方案是否需要多态关联,或者只是在我的表上有一个空列。
比方说,我正在建立一个筹款网站,捐款可以个人或集体形式进行。我的网站不会区分集体用户帐户和个人用户帐户;用户可以将自己组织成一个集体,并根据共识做出捐赠的决定,也可以根据自己的意愿自由捐赠。
所以我有我的Gift,User和Collective模型,以及Membership联接表模型。
集体有许多成员资格,并且通过成员资格拥有许多用户;用户(可能)具有许多成员资格,并且通过成员资格拥有许多集体;礼物应该属于用户或集体。这就是我感到困惑的地方。
我的第一种方法是使用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
这意味着我的Collective类如下:
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
从研究看来,多态关联通常用于更细微的特征,例如注释或注释。通常,该对象已明确拥有,并且所拥有的对象通常与通常具有多对多关系的对象关联。
我想知道在数据库中拥有两列是否会更容易,而根据捐赠是由集体还是个人做出的确认,将空白留空。或者,这可能是多态关联有用性的一个很好的例子吗?
谢谢!
答案 0 :(得分:0)
是的,因此事实证明这种方法确实有效。我将简化我从上一条评论中链接的文章中学到的知识。
我的模型如下:
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
并获取每个礼物实例!
在这种情况下,我还不确定确切何时使用“捐助者”,因为礼物总是只有一个捐助者。
但是我可以按照我想要的去工作!