5

Ich versuche, eine Tabelle zu erstellen, sowohl die Lage und Kategorie eine bestimmte Kampagne mit den folgenden Modellverbänden festgelegt wurde, um zu handhaben:Datenmodellierung 3-Wege-Tabelle has_many Verein

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 

Beim Versuch, eine Kampagne zu erstellen zum Auswählen von zwei verschiedenen Städten und Kategorien ist das Ergebnis NULL für die ID eines der Paramter wie:

enter image description here

Erstellungscode Kampagne:

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 

AKTUALISIERT Die Ansicht, die Kampagne erstellen verwendet zwei getrennte collection_select für Kategorie und Metro als:

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

und

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

Gibt es eine bessere Möglichkeit, die Erstellung einer 3-Tabellen-Beziehung zu ermöglichen, während ich versuche? oder ein Weg, um die Category und Metro Modelle bei Auswahl zu verknüpfen, so dass die resultierende Tabelle so etwas wie unten auf der Kampagnenerstellung ist:

enter image description here

+0

@AlexisRabagoCarvajal gibt es noch keine Antworten. Ich habe das ** UPDATED ** hinzugefügt, um weitere Erläuterungen zu ermöglichen. – Sauron

+0

Ihre Einrichtung sieht für mich gut aus. Ich weiß, das ist ziemlich alt, aber was ist das Problem, das Sie über den obigen Code stellen? – eirikir

+0

Können Sie etwas mehr erklären, was Sie erreichen möchten? Konkret scheint mir, dass Kategorien nur durch eine Kampagne mit Metros verbunden sind - ist das richtig? – Julie

Antwort

0

ich das Problem denke, der Multi wählen kann sein, dass Sie auf Kategorien haben und U-Bahnen. Sie versuchen im Wesentlichen, mehrere foreign_keys für dieselbe Referenz in einen Datensatz für eine Zeile einzufügen. Wenn Kategorie-ID und Metro-ID beide als Ganzzahlen definiert sind, müssten Sie mehrere Datensätze erstellen, um diese speichern zu können.

Sie müssten etwas Logik hinzufügen, um zu sehen, ob Ihre Auswahlparameter eine Länge von> 1 haben und basierend darauf müssen Sie eine neue Zeile erstellen und speichern. Die Logik würde in etwa so aussehen:

Dies würde im Wesentlichen durchlaufen Sie Ihre Multi-Auswahl, um einen neuen Datensatz für jede Kombination zu erstellen.