如何在查找表中实现STI(在Rails中)?

时间:2014-09-10 22:43:38

标签: ruby-on-rails ruby ruby-on-rails-4 sti

我想要两层STI。第一层工作但不确定如何使用STI将第一个模型查找到另一个表。例如:

class Instrument < ActiveRecord::Base

end

class Guitar < Instrument

end

class Piano < Instrument

# and so on...

确定。但是我想跟踪各种类型的乐器,以便我可以告诉他们的类型:

class InstrumentType < ActiveRecord::Base

end

class StringInstrumentType < InstrumentType

end

# etc.

所以...我们的吉他模型变成了:

class Guitar < Instrument
  belongs_to :string_intrument_type
end

class StringInstrumentType < InstrumentType
  has_many :guitars
end

我该如何实现?我如何命名外键列,如何告诉Rails / AR该怎么做?

我离开基地了吗?

这个场景是发明的,但我们发现一些真实的重构要求我们朝着这个方向前进。

1 个答案:

答案 0 :(得分:0)

你的第一个STI是有道理的,另一个不是。在抽象层面上,字符串是InstrumentType的实例,而不是其子类。在我看来,你可能更喜欢使用......:/ / p>

class Instrument < ActiveRecord::Base
  # abstract
end

class StringInstrument < Instrument
  # abstract
end

module Instrument::Keyboard
end

class Guitar < StringInstrument
end

class Piano < StringInstrument
  include Instrument::Keyboard
end

或类似的。显然,它取决于您的实际代码。在示例中,您给出的仪器类型在时间上是相当恒定的,因此可以使用继承。

但我的猜测是,您的类型是动态的,可以由客户添加。你正在寻找的可能是树结构。所以每个类型都有它的父类,每个父类型可能有几个子类。然后,您可以简单地执行Instrument belongs_to instrument_type并指向某个InstrumentType树叶。