【问题标题】:Data Modeling 3 Way Table has_many association数据建模 3 维表 has_many 关联
【发布时间】:2014-11-19 14:51:32
【问题描述】:

我正在尝试构建一个表格来处理某个活动已设置为具有以下模型关联的位置和类别:

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

当尝试创建一个活动以选择两个不同的城市和类别时,其中一个参数的 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

更新 创建活动的视图对 Category 和 Metro 使用两个单独的 collection_select:

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

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

有没有更好的方法来允许创建 3 表关系,因为我正在尝试? 或在选择时链接CategoryMetro 模型的方法,以便在创建活动时生成的表格如下所示:

【问题讨论】:

  • @AlexisRabagoCarvajal 目前还没有答案。我添加了 UPDATED 以进行更多说明
  • 您的设置对我来说看起来不错。我知道这已经很老了,但是你问上面的代码有什么问题?
  • 你能解释一下你想要完成的事情吗?具体来说,在我看来,类别仅通过广告系列与都市圈相关——对吗?

标签: ruby-on-rails activerecord associations data-modeling model-associations


【解决方案1】:

我认为问题可能在于您在类别和地铁上的多项选择。您实际上是在尝试将同一引用的多个 foreign_keys 放入单行记录中。如果类别 ID 和 Metro 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

这实际上会循环通过您的多选来为每个组合创建一条新记录。

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多