has_many通过产生交叉连接结果

时间:2014-09-26 13:18:04

标签: ruby-on-rails rails-activerecord cross-join

我正在尝试构建如所示的多级模型。当用户创建活动时,他们将从表类别和地铁中选择一些类别和一些地铁。然后,这些选择将作为campaign_category和campaign_metro放在两个表格中。但是,在创建这些条目后,我希望在表campaign_category_metro中填充这些组合的另一个表,以允许链接为用户选择的广告系列,类别和地铁以设置出价。

例如,假设用户创建一个ID为10的广告系列,并选择ID为1和2的类别,以及ID为3和4的地铁。在表格中显示campaign_category:

enter image description here

并在表campaign_metro中显示:

enter image description here

在campagin_category_metro中,我希望将上表中的那些置换行作为:

enter image description here

然后,用户可以针对这些广告系列/地铁组合设置出价。

截至目前,在创建广告系列以及选择类别和地铁时,我可以填充表campaign_category和campaign_metro,但最终表campaign_category_metro仍为空白。以下是我的模型:

第一级:

class Campaign < ActiveRecord::Base   
    has_many :campaign_metros, dependent: :destroy
    has_many :metros, through: :campaign_metros

    has_many :campaign_categories, dependent: :destroy
    has_many :categories, through: :campaign_categories
end

class Category < ActiveRecord::Base
    has_many :campaign_categories, dependent: :destroy
    has_many :campaigns, through: :campaign_categories
end

class Metro < ActiveRecord::Base   
    has_many :campaign_metros, dependent: :destroy
    has_many :campaigns, through: :campaign_metros
end

第二级(填充,但与campaign_category_metro的关系不执行任何操作):

class CampaignCategory < ActiveRecord::Base
    belongs_to :campaign
    belongs_to :category

    has_many :campaign_category_metros, dependent: :destroy
    has_many :campaign_metros, through: :campaign_category_metros
end

class CampaignMetro < ActiveRecord::Base
    belongs_to :campaign
    belongs_to :metro

    has_many :campaign_category_metros, dependent: :destroy
    has_many :campaign_categories, through: :campaign_category_metros
end

第三级(创建广告系列时不显示任何内容):

class CampaignCategoryMetro < ActiveRecord::Base
    belongs_to :campaign_category
    belongs_to :campaign_metro
end

如何在广告系列制作时允许使用广告系列campaign_category和campaign_metro的交叉连接结果填充第三级表格?

1 个答案:

答案 0 :(得分:1)

我会考虑挂起一个函数:after_create或:after_initialize, 它设置了交叉连接结果。

class Campaign < ActiveRecord::Base
  after_create :add_campaign_category_metros

  def add_campaign_category_metros
    campaign_categories = this.campaign_categories
    campaign_metros = this.campaign_categories

    campaign_categories.each do |cc|
      campaign_metros.each do |cm|
        ccm = CampaignCategoryMetro.new
        ccm.campaign_category = cc
        ccm.campaign_metro = cm
        ccm.save
      end
    end

  end

不确定您希望如何填充出价,但这是关于我会尝试的内容。