フロントタイヤとバックタイヤは実際には同じものではなく、特定のタイプのタイヤであるため、基本的なSingle-table Inheritanceを探していると思います。これを容易にするにはtype
、テーブルに文字列列を追加しtires
、クラスの 2 つのサブクラスを宣言する必要がありますTire
。
class Motorcycle < ActiveRecord::Base
belongs_to :front_tire
belongs_to :back_tire
end
class Tire < ActiveRecord::Base
end
class FrontTire < Tire
has_many :motorcycles
end
class BackTire < Tire
has_many :motorcycles
end
これにより、またはTire.first
のインスタンスを返すを使用できるようになります。これで要件が満たされます。FrontTire
BackTire
motorcycles
Tire.first.motorcycles
m = Motorcycle.new
ft = FrontTire.new # id 1
bt = BackTire.new # id 2
m.front_tire = ft
m.back_tire = bt
m.save
Tire.first.motorcycles # returns FrontTire #1
# Or, find specifically by tire type
FrontTire.first.motorcycles # all motorcycles with this front-tire
BackTire.first.motorcycles # all motorcycles with this back-tire
tires
または、前輪と後輪のクラスが異なるため、単純に一般的な関係を使用することもできます。
class Motorcycle
has_many :tires
end
class Tire < ActiveRecord::Base
end
class FrontTire < Tire
has_many :motorcycles, foreign_key: :tire_id
end
class BackTire < Tire
has_many :motorcycles, foreign_key: :tire_id
end
Npwは、 a のインスタンスとMotorcycle.first.tires
a のインスタンスの 2 つのオブジェクトの配列を返します。複数のフロント/リア タイヤが同じオートバイに割り当てられるのを防ぐために、バリデーターを追加することをお勧めします。FrontTire
BackTire