数据建模3路表has_many关联

Sau*_*ron 5 activerecord ruby-on-rails data-modeling associations model-associations

我正在尝试构建一个表来处理某个广告系列已使用以下模型关联设置的位置和类别:

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
Run Code Online (Sandbox Code Playgroud)

尝试创建用于选择两个不同城市和类别的广告系列时,其中一个参数的ID的结果为NULL:

在此输入图像描述

广告系列制作代码

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
Run Code Online (Sandbox Code Playgroud)

更新 创建广告系列的视图使用两个单独的类别和地铁的collection_select作为:

        <%= f.collection_select :category_ids, Category.all, :id, :display_category, {}, {multiple: true} %>
Run Code Online (Sandbox Code Playgroud)

    <%= f.collection_select :metro_ids, Metro.all, :id, :full_name, {}, {multiple: true} %>
Run Code Online (Sandbox Code Playgroud)

campaigns_params:

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

有没有更好的方法允许在我尝试时创建3表关系?或者在选择时链接CategoryMetro模型的方法,以便在创建广告系列时生成的结果如下所示:

在此输入图像描述

And*_*rea 0

我认为问题可能是您在类别和都市上的多重选择。您本质上是在尝试将同一引用的多个外键放入单行记录中。如果类别 ID 和都市 ID 都定义为整数,则您需要创建多个记录才能保存它。

您需要添加一些逻辑来查看您的选择参数的长度是否> 1,并基于此您需要创建并保存一个新行。逻辑看起来像这样

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
Run Code Online (Sandbox Code Playgroud)

这实际上会循环遍历您的多项选择,为每个组合创建一个新记录。