我正在尝试构建如所示的多级模型。当用户创建活动时,他们将从表类别和地铁中选择一些类别和一些地铁。然后,这些选择将作为campaign_category和campaign_metro放在两个表格中。但是,在创建这些条目后,我希望在表campaign_category_metro中填充这些组合的另一个表,以允许链接为用户选择的广告系列,类别和地铁以设置出价。
例如,假设用户创建一个ID为10的广告系列,并选择ID为1和2的类别,以及ID为3和4的地铁。在表格中显示campaign_category:
并在表campaign_metro中显示:
在campagin_category_metro中,我希望将上表中的那些置换行作为:
然后,用户可以针对这些广告系列/地铁组合设置出价。
截至目前,在创建广告系列以及选择类别和地铁时,我可以填充表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的交叉连接结果填充第三级表格?
答案 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
不确定您希望如何填充出价,但这是关于我会尝试的内容。