【问题标题】:Rails model complex inheritance associationsRails 建模复杂的继承关联
【发布时间】:2014-01-14 22:25:16
【问题描述】:

我有两个类Ads 和Zones,它们都继承自一个名为Tracked 的类,而后者又包含几个Events。这个想法是Ads 和Zones 可以与各种事件相关联(即“查看”、“点击”、“转化”)。必须跟踪这些事件。

我将如何使用ActiveRecords 进行建模?迁移代码是什么样的?

这是我目前得到的:

事件:

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 关联,但由于区分这三个事件(查看、点击、转换)对我来说至关重要,我认为我不能应用该模式。因此我想我必须使用Polymorphic Associations

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

【问题讨论】:

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


    【解决方案1】:

    多态关联

    要在这里实现多态关联,广告和区域都应该使用:

    has_one :tracked, as: :trackable
    

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

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

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

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

    也许您最好直接在广告和区域上创建“视图”、“点击”和“转化”关联,然后将任何共享逻辑包含在一个模块中。

    您可以采用 Tracked 的逻辑,将其移动到“可跟踪”模块中,并将该模块包含在 Ads 和 Zones 中(如果您使用的是 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,如果您使用多态关联就会出现这种情况。

    【讨论】:

    • 好主意!我真的忘了我可以将数据模型和trackables的逻辑分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多