5

Belirli bir kampanya aşağıdaki modeli derneklerle olarak ayarlandı konum ve kategori hem işlemek için bir tablo oluşturmak için çalışılıyor:Veri Modelleme 3 Yollu Tablo has_many dernek

class Campaign < ActiveRecord::Base 

    has_many :campaign_category_metro_bids, dependent: :destroy 
    has_many :metros,  through: :campaign_category_metro_bids 
    has_many :categories, through: :campaign_category_metro_bids 

end 

class Metro < ActiveRecord::Base 

    has_many :campaign_category_metro_bids 
    has_many :campaigns, through: :campaign_category_metro_bids 
    has_many :categories, through: :campaign_category_metro_bids 

end 

class Category < ActiveRecord::Base 

    has_many :campaign_category_metro_bids 
    has_many :campaigns, through: :campaign_category_metro_bids 
    has_many :metros,  through: :campaign_category_metro_bids 

end 

class CampaignCategoryMetroBid < ActiveRecord::Base 
    belongs_to :campaign 
    belongs_to :category 
    belongs_to :metro 
end 

bir kampanya oluşturmaya çalışırken

enter image description here

Kampanya oluşturma kodu:

012 iki farklı şehir ve katogorilerini sonucu olarak paramters birinin kimliği için NULL olur
def new 
    if signed_in? 
     # create new campaign 
     @user = User.find(params[:id]) 
     @campaign = @user.campaigns.new 
    else 
     redirect_to signin_path 
    end 
end 

def create 
    @campaign = User.find(params["campaign"]["user_id"]).campaigns.build(campaign_params) 

    if @campaign.save 
     flash[:success] = "Campaign created!" 
     redirect_to current_user 
    else 
     render 'new' 
    end 
end 

kampanya oluşturmak için görünümü GÜNCELLENDİ olarak Kategori ve Metro için iki ayrı collection_select kullanır:

 <%= f.collection_select :category_ids, Category.all, :id, :display_category, {}, {multiple: true} %> 

ve

<%= f.collection_select :metro_ids, Metro.all, :id, :full_name, {}, {multiple: true} %> 

campaigns_params:

def campaign_params 
     params.require(:campaign).permit(:name, :campaign_category_metro_bid_id, 
             :metro_ids => [], :category_ids => []) 
    end 

Denediğim 3 tablo ilişkisinin yaratılmasına izin vermenin daha iyi bir yolu var mı? veya çıkan tablo kampanya oluşturulduktan sonra aşağıdaki gibi bir şey olacak şekilde seçilmesi de Category ve Metro modellerini bağlanmanın bir yolu:

enter image description here

+0

@AlexisRabagoCarvajal Henüz cevap yok. Daha fazla açıklama sağlamak için ** GÜNCELLEME ** ekledim – Sauron

+0

Kurulumun bana iyi görünüyor. Bunun oldukça eski olduğunu biliyorum, ama yukarıdaki kod hakkında sorduğunuz problem nedir? – eirikir

+0

Neyi başarmaya çalıştığınızı biraz daha açıklayabilir misiniz? Spesifik olarak, kategorilerin sadece bir kampanya tarafından sadece metriklerle ilgili olduğunu düşünüyorum - doğru mu? – Julie

cevap

0
Sorunun çoklu kategorilere üzerinde sahip olduğu seçmek olabilir düşünüyorum

ve metre. Aynı referans için birden fazla yabancı_yatı tek bir satır kaydına sığdırmaya çalışıyorsunuz. Kategori kimliği ve metro kimliği her ikisi de tamsayı olarak tanımlanmışsa, bunu kaydedebilmek için birden çok kayıt oluşturmanız gerekir.

Seçim parametrelerinizin> 1 uzunluğuna sahip olup olmadığına ve yeni bir satır oluşturup kaydetmeniz gerekeceğine göre bir mantık eklemeniz gerekir. mantık her bir kombinasyon için yeni bir kayıt oluşturmak için çoklu seçim yoluyla bu

params[:category_ids].each do |category| 
    params[:metro_ids].each do |metro| 
    @user.campaign.create(category_id: category, metro_id:metro) #any other params would go here too 
    end 
end 

gibi bu olur aslında döngü görünecektir.