继承方法:STI? MTI?或简单的多态关联?

时间:2013-01-18 22:14:18

标签: ruby-on-rails inheritance polymorphic-associations multiple-tables sti

我正在实施一个应用来管理生产订单。每个订单都有许多流程(阶段),包括打印和弯曲。所有流程都有一些共同的属性,如数量和注释,以及一些阶段特定的属性:

create_table :stages do |t|
  t.integer :number
  t.decimal :roll_width
  t.decimal :quantity
  t.string :comments
  t.boolean :finished

  t.timestamps
end

create_table :printing_stages do |t|
  t.integer :color
  t.decimal :technical_card

  t.timestamp
end

create_table :bending_stages do |t|
  t.decimal :flap_width
  t.boolean :seal_distance

   t.timestamps
end

我不确定要遵循的方法,以便能够轻松访问其常见的+特定属性。

如果我使用STI,我最终会得到一个巨大的sigle表,因为某些阶段有10个以上的特定属性。

如果我使用多态关联:

class Stage < ActiveRecord::Base
  belongs_to :stageable, :polymorphic => true
end

class SlittingStage ActiveRecord::Base
  has_one :stage, :as => stageable
end

class PrintingStage ActiveRecord::Base
  has_one :stage, :as => stageable
end

然后我将不得不访问打印阶段的评论,例如printing_stage.stage.comments,这是恕我直言,相当繁琐,并不是那么优雅。

最后,我不确定使用MTI的含义和后果。

你能给我一些建议吗?

1 个答案:

答案 0 :(得分:2)

这位女士说它比我能做得更好。如果你跳到大约20分钟,这就是你的答案所在。

Make a Mess by Sandi Metz