首页 > 解决方案 > Rails 关联、嵌套表单和 STI

问题描述

这是我的简化模型

class Offer < ApplicationRecord
  has_many :rooms
end

class Room < ApplicationRecord
  belongs_to :offer
end

class Kitchen < Room
end

我在厨房使用 STI,因为它似乎是表达我想做的事情的正确方式(我可能错了)。

我希望能够创建包含房间的优惠。我有“常规”房间,它们直接是 Room 的实例,还有更多指定的房间,例如可以具有额外属性的 Kitchen。

我正在使用 cocoon 创建嵌套表单,它可以很好地创建报价并添加常规房间。但是我怎样才能添加厨房呢?

也许这是一个架构问题而不是实现问题。你将如何设法做这样的事情?

标签: ruby-on-railsactiverecord

解决方案


一种解决方案是将 JSONB 列添加data到您的rooms表中。然后你可以使用jsonb_accessor gem 优雅地管理 STI。

我假设您已经有type专栏,因此您可以执行以下操作:

Kitchen.create(offer_id: 1, name: "Great Kitchen", description: "It is great!")

注意:description将是 JSONBdata列的属性。此外,您可以为 JSONB 属性创建索引,甚至可以进行查询。根据我的经验,您希望将 JSONB 作为存储附加信息的地方,而不是用于繁重查询的地方。

我希望这有帮助。


推荐阅读