我想要两层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该怎么做?
我离开基地了吗?
这个场景是发明的,但我们发现一些真实的重构要求我们朝着这个方向前进。
答案 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树叶。