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_idnil

验证里面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 - 如何在活动记录查询中为包含()和连接()提供别名

如何在Rails 5中获取具有匹配ID的连接表中的记录数

Rails 在连接表上加入条件

无法在 Rails 3.2 中使用复合唯一索引将记录添加到连接表

更改连接表中的属性值时,Rails 5 正在插入而不是更新

rails:关联表(has_and_belongs_to_many)不保存任何记录