gpt4 book ai didi

ruby-on-rails - 数据建模三向表 has_many 关联

转载 作者:行者123 更新时间:2023-12-03 17:48:52 26 4
gpt4 key购买 nike

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

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,如下所示:

enter image description here

事件创建代码:
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

更新
创建事件的 View 使用两个单独的 collection_select 用于 Category 和 Metro,如下所示:
        <%= f.collection_select :category_ids, Category.all, :id, :display_category, {}, {multiple: true} %>


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

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

有没有更好的方法可以在我尝试时创建 3 个表关系?
或链接 Category 的方法和 Metro选择模型,以便在创建事件时生成的表如下所示:

enter image description here

最佳答案

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

这基本上会遍历您的多选,为每个组合创建一个新记录。

关于ruby-on-rails - 数据建模三向表 has_many 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26028291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com