在这里建模数据库的最佳方法是什么。多态还是性传播感染?滑轨

时间:2018-07-21 16:04:29

标签: ruby-on-rails

我有三种类型的HangoutHomeBarRestaurant。为这三个视频群聊建模的好方法是什么?

我正在尝试模拟类似于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。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

创建环聊模型-例如区分酒吧,餐厅等的枚举。

如果发现它们在行为上有重大差异,则可以稍后将其转换为STI。 (或者,甚至,如果您想使生活变得不必要地困难,请参见上面描述的类表继承。)

但是从短期来看,最好将它们全部放在一个表中并由一个类实现,从而为您提供最好的服务。 95%的功能将所有视讯聚会视作同等功能;它们获得不同的UI图标(例如)的事实不一定是类级别的区别。

不要太快地为您域中的每个名词创建单独的模型类:只将单独的实施行为分开。在有重量需要拉时,而不是从前引入更多。