使用多态关联来确定所有权?还是我应该在桌子上留下一个空列?

时间:2018-07-06 02:05:21

标签: ruby-on-rails polymorphic-associations

我一直在研究一个问题,无法确定该解决方案是否需要多态关联,或者只是在我的表上有一个空列。

比方说,我正在建立一个筹款网站,捐款可以个人或集体形式进行。我的网站不会区分集体用户帐户和个人用户帐户;用户可以将自己组织成一个集体,并根据共识做出捐赠的决定,也可以根据自己的意愿自由捐赠。

所以我有我的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

从研究看来,多态关联通常用于更细微的特征,例如注释或注释。通常,该对象已明确拥有,并且所拥有的对象通常与通常具有多对多关系的对象关联。

我想知道在数据库中拥有两列是否会更容易,而根据捐赠是由集体还是个人做出的确认,将空白留空。或者,这可能是多态关联有用性的一个很好的例子吗?

谢谢!

1 个答案:

答案 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

并获取每个礼物实例!

在这种情况下,我还不确定确切何时使用“捐助者”,因为礼物总是只有一个捐助者。

但是我可以按照我想要的去工作!