2014-09-26 98 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