Rails模型复杂的继承关联

时间:2014-01-14 22:25:16

标签: ruby-on-rails activerecord migration polymorphic-associations

我有两个类AdZone,它们都继承自名为Tracked的类,后者又包含多个Event个。我们的想法是,AdZone可以与各种事件相关联(即'查看','点击''转换& #39)。必须跟踪这些事件。

我如何使用ActiveRecord进行模拟?迁移代码会是什么样的?

这是我到目前为止所得到的:

事件:

class Event < ActiveRecord :: Base

  attribute :event_date
  belongs_to :trackable, polymorphic: true
[...]
end

履带:

class Tracked < ActiveRecord :: Base

  self.abstract_class = true
  has_many :views, class_name: "Event"
  has_many :clicks, class_name: "Event"
  has_many :conversions, class_name: "Event"

  belongs_to :trackable, polymorphic: true
[...]
end

广告:

class Ad < Tracked

  attribute :size, :content
  attr_accessor :width, :height
  belongs_to :advertisers
  has_and_belongs_to_many :campaigns
[...]
end

广告系列:

require 'date'

class Campaign < ActiveRecord :: Base

  attribute :name, :target_url,
            :expiration_date,:categories,
            :billing_type, :budget, :budget_type,
            :cp_click, :cp_view, :cp_conversion

  belongs_to :advertiser
  has_and_belongs_to_many :ads
  has_many :zones
[...]
end

起初我认为我可能想要使用through关联,但由于我最重要的是要区分这三个事件(查看,点击,转换),我认为我可以&#39;应用那种模式。因此我认为我必须使用Polymorphic Associations

请注意,我粘贴的代码包含创建模型的所有必要信息,即我没有遗漏任何属性或关联。另外,我知道如何为不属于上述问题的所有属性/关联编写迁移代码。

1 个答案:

答案 0 :(得分:1)

多态协会

要在此处实现多态关联,广告和区域都应使用:

has_one :tracked, as: :trackable

您不需要在事件中使用此行:belongs_to :trackable, polymorphic: true,因为您已在Tracked中拥有该行。

然后,您需要运行一些迁移来设置Tracked以处理trackable关联(this解释得比我更好)。

我认为您还需要删除Tracked中的self.abstract_class = true,因为它现在将在数据库中显示。

或许有更好的方法来解决这个问题:

也许您最好直接在广告和区域上创建“观看次数”,“点击次数”和“转化”关联,然后将任何共享逻辑与模块包含在一起。

您可以采用Tracked的逻辑,将其移动到“可跟踪”模块中,并将该模块包含在广告和区域中(如果您使用的是Rails 4,则可以wrap this up in a 'trackable' concern)。

您还可以将以下关联移动到广告和区域中:

  has_many :views, class_name: "Event"
  has_many :clicks, class_name: "Event"
  has_many :conversions, class_name: "Event"

然后您将不再需要Tracked类。

这种方法意味着您可以调用Ad.first.views而不是Ad.first.tracked.views,如果您使用了多态关联,就会出现这种情况。