我有三种类型的Hangout
:Home
,Bar
,Restaurant
。为这三个视频群聊建模的好方法是什么?
我正在尝试模拟类似于airbnb的应用,以便客户可以租用或共享视频群聊。家里,酒吧,餐厅以及将来可能有更多类型的hangouta都可以共享。
这是一种使用多态建模的好方法吗?
class Hangout < ApplicationRecord
belongs_to :hangoutable, polymorphic: true
end
class Home < ApplicationRecord
has_one :hangout, as: :hangoutable, dependent: :destroy
end
class Bar < ApplicationRecord
has_one :hangout, as: :hangoutable, dependent: :destroy
end
...
这里的想法是父模型是一个Hangout
,它可以是三个hangoutables
之一。它是否正确?对此的投诉是,它有点倒...每个Hangout
都有一个hangout
,但是视频群聊应该是父级的,而不是这里建模的子级的子级。这个可以吗?这会给我带来麻烦吗?通常,多态是通过将多态实体作为孩子来完成的(例如imageable
属于一个人,一个地方,一个东西等),但在这里我希望Hangout
成为父。
视频群聊的基础表如下:
create_table "hangouts", force: :cascade do |t|
t.string "hangoutable_type"
t.bigint "hangoutable_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["hangoutable_type", "hangoutable_id"], name: "index_hangouts_on_hangoutable_type_and_hangoutable_id"
end
还向我建议了STI,但是在阅读this之后,我不确定这些表将来是否会共享相同的数据。所以我不愿使用STI。
我该怎么办?
答案 0 :(得分:1)
仅 创建环聊模型-例如区分酒吧,餐厅等的枚举。
如果发现它们在行为上有重大差异,则可以稍后将其转换为STI。 (或者,甚至,如果您想使生活变得不必要地困难,请参见上面描述的类表继承。)
但是从短期来看,最好将它们全部放在一个表中并由一个类实现,从而为您提供最好的服务。 95%的功能将所有视讯聚会视作同等功能;它们获得不同的UI图标(例如)的事实不一定是类级别的区别。
不要太快地为您域中的每个名词创建单独的模型类:只将单独的实施行为分开。在有重量需要拉时,而不是从前引入更多。