2014-09-26 107 views
0

我试图构建如展示的多级模型。当用户创建一个活动时,他们将从表类别和地铁中选择一些类别和一些地铁。然后这些选择将作为campaign_category和campaign_metro放在两个表中。但是,在创建这些条目后,我希望能够使用表campaign_category_metro中这些组合的排列填充另一个表,以便链接广告系列,为用户选择的类别和都市区设置出价。Rails Multi Level has_many通过

更新:

例如说一个用户创建具有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 

我怎样才能允许第三级表是po在创立活动时选择了所选类别和地铁的排列组合?

+1

你想用CampaignCategoryMetro解决什么问题?即使它被填充,其中的信息也是多余的。 – 2014-09-26 00:37:44

+0

是的,你为什么加入模型需要记录来知道其他模型是什么?你可以问它的父母。 – DiegoSalazar 2014-09-26 00:53:19

+0

我已更新表campaign_category_metro以说明原因。每个类别和地铁的选择,这些分组的组合都将有其各自的投标价格,用户以后可以设置 – Sauron 2014-09-26 00:54:27

回答

1

下面是一些代码,这将导致你在你的例子贴campaign_category_metro表:

campaign = Campaign.create # pretend the id is now 10 

# this will create the join tables you provided as examples 
campaign.categories << [Category.find(1), Category.find(2)] 
campaign.metros << [Metro.find(3), Metro.find(4)] 

# Get the join tables 
campaign_categories = campaign.campaign_categories 
campaign_metros = campaign.campaign_metros 

我们现在有这些:

campaign_categories campaign_metros

到目前为止好,只设置一些背景,以确保我们在同一页面上。现在来生成最终的排列,并创建最后一个表:

@campaign_category_metros = [] 

# this outer loop will run twice and provide campaign_category ids 15 and 16 
campaign_categories.each do |campaign_category| 
    # this inner loop will run twice and provide campaign_metro ids 25 and 26 
    campaign_metros.each do |campaign_metro| 
    # this next bit will run 4 times and pair 15 with 25 and 26 and 16 with 25 and 26 
    @campaign_category_metros << CampaignCategoryMetro.create({ 
     campaign_category_id: campaign_category.id, 
     campaign_metro_id: campaign_metro.id 
    }) 
    end 
end 

现在@campaign_category_metros将等于:

campaign_category_metro

除非当然空白投标。您可以在列表中呈现@campaign_category_metros,以允许用户对这4种组合进行出价。

这里的想法是,每个campaign_category我们将创建一个campaign_category_metro记录与每个campaign_metro

注意: Rails中没有内置的机制可以为你做到这一点。

+0

谢谢。注意:我使用活动记录来创建campaign_category和campaign_metro。但是对于您的实现,如果我们只是简单地按照您所描述的方式对记录的创建进行了硬编码,那么campaign_category_metro表的可更新性如何。或者我还需要建立单独的更新/编辑方法,并注意模型中的更改? – Sauron 2014-09-26 15:22:24

+0

您可以将该代码放入或从活动控制器创建actin中调用该代码,因为您希望在制作新广告系列时创建新的排列。然后在campaign_category_metros控制器中,您可以直接更新这些最终记录。 – DiegoSalazar 2014-09-26 15:26:46

+0

另请注意,我在创建'campaign.categories'和'campaign.metros'的地方写的第一个代码片段只是一个示例,表示您已在视图中做了哪些操作,以便用户创建广告系列并选择类别和地铁。不要使用该部分,只使用当前创建的广告系列的地铁和类别创建决赛桌的部分。 – DiegoSalazar 2014-09-26 15:38:40