5

Sto tentando di costruire una tabella per gestire sia l'ubicazione e la categoria di una certa campagna è stata impostata con le seguenti associazioni modello:Data Modeling 3 vie associazione Tabella has_many

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 

Quando si tenta di creare una campagna per la selezione di due città e categorie diverse il risultato è NULL per l'id di una delle paramters come:

enter image description here

campagna codice di creazione:

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 

AGGIORNATO La vista per creare la campagna utilizza due collection_select separato per Categoria e Metro come:

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

e

<%= 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 

Esiste un modo migliore per consentire la creazione di una relazione con tre tabelle mentre sto tentando? o un modo per collegare i modelli Category e Metro alla selezione in modo che la tabella risultante è qualcosa di simile al di sotto al momento della creazione della campagna:

enter image description here

+0

@AlexisRabagoCarvajal non ci sono ancora risposte. Ho aggiunto il ** AGGIORNATO ** per consentire ulteriori chiarimenti – Sauron

+0

La configurazione mi sembra soddisfacente. So che è piuttosto vecchio, ma qual è il problema che stai ponendo riguardo al codice sopra? – eirikir

+0

Puoi spiegare un po 'di più quello che stai cercando di realizzare? In particolare, mi sembra che le categorie siano solo collegate alle metros da una campagna - è corretto? – Julie

risposta

0

Credo che il problema potrebbe essere la più scegliere di avere sulle categorie e metropolitane. Stai essenzialmente cercando di inserire più foreign_keys per lo stesso riferimento in un singolo record di riga. Se ID categoria e ID metro sono entrambi definiti come numeri interi, sarà necessario creare più record per poterlo salvare.

Dovresti aggiungere un po 'di logica per vedere se i parametri di selezione hanno una lunghezza> 1 e in base a ciò dovrai creare e salvare una nuova riga. La logica sarebbe simile a questa

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 

Questo ciclo sarebbe essenzialmente attraverso la vostra selezione multipla per creare un nuovo record per ogni combinazione.