我有两个类Ad
和Zone
,它们都继承自名为Tracked
的类,后者又包含多个Event
个。我们的想法是,Ad
和Zone
可以与各种事件相关联(即'查看','点击''转换& #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
。
请注意,我粘贴的代码包含创建模型的所有必要信息,即我没有遗漏任何属性或关联。另外,我知道如何为不属于上述问题的所有属性/关联编写迁移代码。
答案 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
,如果您使用了多态关联,就会出现这种情况。