![](/img/trans.png)
[英]ActiveRecord, has_many :through, and Polymorphic Associations
[英]Rails ActiveRecord: Three Table has_many through: 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
尝试创建用于选择两个不同城市和类别的广告系列时,其中一个参数的ID为NULL,结果为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
已更新用于创建市场活动的视图将两个单独的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} %>
campaigns_params:
def campaign_params
params.require(:campaign).permit(:name, :campaign_category_metro_bid_id,
:metro_ids => [], :category_ids => [])
end
我正在尝试更好的方法来创建3表关系吗? 或在选择时链接“ Category
和“ Metro
模型的方法,以便在创建广告系列时生成的表格如下所示:
如果要确保多个表之间的数据一致性,我将从进行验证开始。 例如:
class CampaignCategoryMetroBid < ActiveRecord::Base
belongs_to :campaign
belongs_to :category
belongs_to :metro
validates :campaign, presence: true
validates :category, presence: true
validates :metro, presence: true
end
如果需要的话,您可能还想将此约束添加到数据库中(请参阅迁移指南)。 这样一来,即使从db cli中,也没有人能够破坏一致性。 现在,每次您的代码尝试创建不带外键的CampaignCategoryMetroBid实例时,ActiveRecord都会大喊大叫,并将其余代码约束为“行为”。
如果您真的只想注入一些默认外键(或调整表单数据),则可以在控制器操作中预处理表单数据时执行此操作。 例如:
class CampaignsController < ActionController::Base
def create
# Possibly refactor to a before_action
if params[:campaign] && params[:capmaign][:metro_ids] && params[:capmaign][:metro_ids].empty?
params[:campaign][:metro_ids] = [DEFAULT_CAMPAIGN_ID]
end
# Do the rest
end
end
我希望这有助于大致确定方向:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.