0

У меня есть два класса Ad s и Zone s, которые оба наследуют от класса Tracked, который, в свою очередь, содержит несколько Event s. Идея состоит в том, что Ad s, а также Zone s могут быть связаны с различными событиями (например, «Вид», «Щелчок», «Конверсия»). Эти события необходимо отслеживать.Rails модель комплексных ассоциаций наследования

Как бы я мог и моделировать, используя 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 ассоциацию, но так как она имеет первостепенное значение для меня, чтобы различать эти три события (View, Click, Conversion) Я думаю, что я могу применить этот шаблон. Поэтому я думаю, что мне нужно использовать Polymorphic Associations.

Обратите внимание, что код, который я вставил, содержит всю необходимую информацию для создания модели, т. Е. Нет атрибутов или ассоциаций, которые я забыл. Также я знаю, как написать код миграции для всех атрибутов/ассоциаций, которые не относятся к проблеме, описанной выше.

ответ

1

Полиморфной Ассоциация

Для реализации полиморфных ассоциаций здесь, объявление и зона оба должны использовать:

has_one :tracked, as: :trackable 

Вы не нуждались бы в этой линии в Events: belongs_to :trackable, polymorphic: true, поскольку вы уже имеют его в Отслеживаются.

Вам необходимо выполнить некоторые миграции для настройки Tracked для обработки ассоциации trackable (this объясняет, что лучше, чем я мог).

Я думаю, вам также нужно удалить self.abstract_class = true в Tracked, так как он будет представлен в db.

Существует, возможно, лучший способ приблизиться к этому:

Может быть, вы бы лучше создания «взгляды», «щелчки» и «преобразования» ассоциаций непосредственно на объявления и зон, а затем в том числе любые общие логики с модулем.

Вы можете использовать логику отслеживания, переместить ее в «отслеживаемый» модуль и включить этот модуль в объявления и зоны (если вы используете 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" 

Вы тогда не нуждались бы в отслеживаемом классе больше.

Этот подход означает, что вы могли бы назвать Ad.first.views, а не Ad.first.tracked.views, который был бы в случае, если вы использовали полиморфную ассоциацию.

+1

Отличная идея! Я действительно забыл, что могу отделить модель данных и логику отслеживания. – Nessuno

Смежные вопросы