Rails 5:在连接表记录上保存记录时的 STI 空键
Posted
技术标签:
【中文标题】Rails 5:在连接表记录上保存记录时的 STI 空键【英文标题】:Rails 5: STI null key when save record on join table record 【发布时间】:2018-02-01 03:39:24 【问题描述】:我有这种情况。
class StoreSubscriptionProduct << ApplicationRecord
end
class SpecialProduct < StoreSubscriptionProduct
has_many :special_product_item_groups
has_many :item_groups, through: :special_product_item_groups
end
class ItemGroup << ApplicationRecord
has_many :special_product_item_groups
has_many :special_products, through: :special_product_item_groups
end
class SpecialProductItemGroup < ApplicationRecord
# special_product_id
# item_group_id
belongs_to :special_product
belongs_to :item_group
end
控制器:
class SpecialProductsController < BaseController
def create
special_product = SpecialProduct.new(permitted_params)
if special_product.save
# blah
else
# blah
end
end
end
我当前遇到的问题是,当我在控制器上收到用于创建 SpecialProduct 的参数并通过参数发送 item_group_ids 时。
创建连接表时记录special_product_id
其nil
验证里面item_group_id
是ok的,但是special_product_id
没有赋值。
=> #<SpecialProductItemGroup:0x007fdb3c4905b0
id: nil,
special_product_id: nil,
item_group_id: 1,
created_at: nil,
updated_at: nil>
我缺少一些 foreign_key 或其他选项,以便分配 special_product_id
提前致谢。
【问题讨论】:
【参考方案1】:我假设您的 STI 表是 item_groups
,您在其中创建了 type
列:
class SpecialProduct < StoreSubscriptionProduct
has_many :special_product_item_groups, class_name: 'SpecialProductItemGroup'
has_many :item_groups, class_name: 'ItemGroup', through: :special_product_item_groups
end
class ItemGroup < ApplicationRecord
has_many :special_product_item_groups, class_name: 'SpecialProductItemGroup'
has_many :special_products, class_name: 'SpecialProduct', through: :special_product_item_groups
end
class SpecialProductItemGroup < ApplicationRecord
# special_product_id
# item_group_id
belongs_to :special_product, class_name: 'SpecialProduct'
belongs_to :item_group, class_name: 'ItemGroup', foreign_key: :item_group_id, optional: true
end
如果您的 STI 是 special_products
,则适当更改外键。另外你可以查看this discussion on Github。
【讨论】:
以上是关于Rails 5:在连接表记录上保存记录时的 STI 空键的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 - 如何在活动记录查询中为包含()和连接()提供别名