0

次のモデル設定を検討してください。

Model A
  has one B1, type: B
  has one B2, type: B

Model B
  has many A

私はこの仕事ができるようにしたい:

class Motorcycle < ActiveRecord::Base
  has_one :front_tire, class_name: "Tire"
  has_one :back_tire, class_name: "Tire"
end

class Tire < ActiveRecord::Base
  has_many :motorcycles
end

最終結果は、私がこれを行うことができるということです:

m = Motorcycle.new
ft = Tire.new
bt = Tire.new
m.front_tire = ft
m.back_tire = bt
m.save
Tire.first.motorcycles #=> [...]
4

5 に答える 5

1

フロントタイヤとバックタイヤは実際には同じものではなく、特定のタイプのタイヤであるため、基本的な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のインスタンスを返すを使用できるようになります。これで要件が満たされます。FrontTireBackTiremotorcyclesTire.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.tiresa のインスタンスの 2 つのオブジェクトの配列を返します。複数のフロント/リア タイヤが同じオートバイに割り当てられるのを防ぐために、バリデーターを追加することをお勧めします。FrontTireBackTire

于 2012-08-26T16:38:32.490 に答える
1

とペアにすることはできません。has_manyとペアhas_onehas_*する必要がありますbelongs_to(もちろん は例外ですhas_many :through)。

motorcycle belongs_toしたがって、 :に変更するかfront_tire、3 番目の結合モデルを作成する必要があります。

于 2012-08-26T16:25:21.820 に答える
0

私はこのようなものがうまくいくはずだと思います

class Tire < ActiveRecord::Base
  belongs_to :motorcycle
end

に変更has_many :motercyclesしますbelongs_to :motorcycle

Motorcyclehas_one(から) Tiresに属する多くのタイヤがありますmotorcycle

またはあなたは次のようなものを使用することができます

class Motorcycle < ActiveRecord::Base
  has_many :tires
end

class Tire < ActiveRecord::Base
  belongs_to :motorcycle
end

フロントまたはバックの値を保持できるウィッチをTire含むcolumn position

モデルにいくつかの定数を作成して、次のような定数を維持できます

class Tire < ActiveRecord::Base
 FROUT 1
 BACK 2
 #....
end

これは単なる別のオプションです:)

于 2012-08-26T16:18:46.657 に答える
0

これはまったくテストされていませんが、次のようなものはどうでしょうか。

has_many :motorcycles,
         :class_name => 'Motorcycle',
         :finder_sql => proc { "select * from motorcycles
                         where front_tire_id = #{id} OR
                         back_tire_id = #{id}" }
于 2012-08-26T15:47:22.117 に答える
-1

私はこの一連のコードでそれを解決することができました:

class Motorcycle < ActiveRecord::Base
  has_many :tire_brands
  has_one :front_tire, class_name: "Tire"
  has_one :back_tire, class_name: "Tire"
end

class Tire < ActiveRecord::Base
  belongs_to :motorcycle
  belongs_to :tire_brand
end

class TireBrand < ActiveRecord::Base
  has_many :tires
  has_many :motorcycles, through: :tires
end
于 2012-08-26T17:55:52.843 に答える