0

これの最良の実装が何であるかはわかりません。障害を追跡したい 2 つの異なるタイプのプロパティがあります。特定のプロパティの表示ページに障害を表示し、障害インデックス ページですべての障害を表示できるようにしたいと考えています。

各プロパティに関連する複数の障害テーブルを作成するか、各プロパティがリンクする 1 つの障害テーブルを作成する方がよいでしょうか? それらがすべてまとめられている場合、障害テーブルに多数の複数の空白の id 属性があることを懸念しています。しかし、それらが分割されている場合、それらをビューに表示することが心配です。これをレールで実装しています。

1 つの障害テーブル

Cars                   Trucks                Faults
-----------            ----------           -----------
car_id                 truck_id              fault_id
attribute_1            attribute_1           car_id
                                             truck_id
                                             fault description

2 つの障害テーブル (プロパティごとに 1 つ)

Cars                   Trucks                car_Faults              truck_faults
-----------            ----------           -----------              -----------------
car_id                 truck_id              car_fault_id            truck_fault_id
attribute_1            attribute_1           car_id                  truck_id  
                                             fault description       fault description
4

2 に答える 2

2

現在所有しているモデルとのポリモーフィックな関連付け、または単一のテーブル継承を使用して、車とトラックを単一のクラスに結合することができます。


ポリモーフィック アソシエーションは次のようになります。

Cars                   Trucks                Faults
-----------            ----------           -----------
id                     id                    id
attribute_1            attribute_1           faultable_id
                                             faultable_type
                                             fault description

faultable_id(int) 列とfaultible_type(string) 列を に追加する必要がありますFault。モデルは次のようになります。

def Car < ActiveRecord::Base
  has_many :faults, :as => :faultable
end

def Truck < ActiveRecord::Base
  has_many :faults, :as => :faultable
end

def Fault < ActiveRecord::Base
  belongs_to :faultable, :polymorphic => true
end

これを行うことができます:

@car.fault
# => returns car's fault

@fault.faultible
# => returns car or truck

単一テーブル継承 (STI)は次のようになります。

Vehicle                Faults
-----------            ---------- 
id                     id   
type                   vehicle_id
attribute_1            fault description

これは理解するのが少し難しいですが、CarどちらもスーパークラスTruckからフォルトを継承しVehicleます。これにより、1 つのデータベース テーブルのみを使用しながら、車とトラックを障害に関連付けることができます (単一テーブルの継承)。

車とトラックは車両レコードとして保存され、共通の属性を共有します。これは、"color" や "make" などのほぼ同一の属性を持つモデルに最適です。未使用の属性 (トラック オブジェクトの車の属性) は nil になることに注意してください。多くの交換不可能な属性 (したがって多くの nil) を扱っている場合は、代わりにポリモーフィック アソシエーションを使用することをお勧めします。

モデル:

def Vehicle < ActiveRecord::Base
  has_many :faults
end

def Car < Vehicle
end

def Truck < Vehicle
end

def Fault < ActiveRecord::Base
  belongs_to :vehicle
end

これにより、次のことができます。

@truck.fault
# => returns truck's fault

@fault.vehicle
# => returns either a Car or Truck object, depending on the type

STI の使用にはいくつかの注意事項があります。

  • サブクラス (車またはトラック) をインスタンス化する必要があります。スーパークラス (つまり ) をインスタンス化しないVehicle.newでください。typeの属性には触れないでくださいVehicle。Rails はそれを自動的に処理します。

  • コレクション クラス メソッドがないため、(すべてのトラックの障害) のようなものTruck.faultsは機能しません。

于 2013-04-25T00:57:45.240 に答える
0

すべての障害を一緒に表示し、各プロパティの障害も表示できるようにしたい場合は、このような解決策があなたが探しているものかもしれないと思います

Vehicles                Faults                      Types
-----------            -----------                 ---------
vehicle_id             fault_id                    vehicle_type
vehicle_type(FK)       vehicle_id(FK)                  
attribute_1            vehicle_type(FK)
                       fault_description

そして、エントリを in にTypes、1 つはCarに、もう 1 つはTruck

Edit に入力vehicle_typeします。FaultsCar

SELECT fault_id AS F FROM Faults WHERE F.vehicle_id IN
  SELECT vehicle_id FROM Vehicles AS V WHERE V.vehicle_type IN
    SELECT vehicle_type FROM Types WHERE vehicle_type = 'Car'
于 2013-04-25T00:42:21.157 に答える