1

私は車両モデルを持っています:

class Vehicle < ActiveRecord::Base
validates_presence_of :num_of_wheels
validates_presence_of :make
validates_presence_of :model
end

このクラスから、「乗用車」、「オートバイ」、「トラック」など、それぞれ独自の必須属性を持つ、スケーリング可能な数の車両タイプを用意したいと考えています。たとえば、乗用車にはドアの数が必要な場合がありますが、それはオートバイ タイプには適用されません。同時に、オートバイと乗用車の両方が、作成時に車両の必須属性を必要とする/継承する必要があります。

ここで重要なのは、発明される可能性のある、または保管する必要があるさまざまな種類の車両の数を実際に予測できないことです。そのため、新しい車両タイプを追加するためのスケーラブルな方法が必要です。また、UI とビューに関しては、たとえば、私のタイプがドロップダウン メニューから利用できない場合に、新しい車両タイプを作成し、db に車両タイプを入力させて、それをUIに反映させます。

Rails とのこの関係をモデル化する最良の方法は何でしょうか? has_one :through 関係を使用することを考えていますが、それが最善の方法かどうかはわかりません。たとえば、ビークルはオペレーターに割り当てられます。そして、人は一度に 1 台の車両しか操作できません...つまり、次のように言えます。

class Vehicle < ActiveRecord::Base
has_one :motorcycle, :through => :vehicle_type
has_one :passenger_car, :through => :vehicle_type
has_many :vehicle_types
validates_presence_of :num_of_wheels
validates_presence_of :make
validates_presence_of :model
end

class VehicleType < ActiveRecord::Base
belongs_to :vehicle
belongs_to :passenger_car
belongs_to :motorcycle
end

class PassengerCar < ActiveRecord::Base
belongs_to :vehicle_type
validates_presence_of :doors
end

class Motorcycle < ActiveRecord::Base
belongs_to :vehicle_type
validates_presence_of :saddlebags
end

ただし、考えられるすべてのタイプを車両モデルに追加する必要があるのは扱いにくいように思われます。オペレーターは一度に 1 つの車両しか運転で​​きないため、他のすべての車両タイプを車両モデルの :has_one ステートメントに入れるのは冗長に思えます。

どんな考えでも大歓迎です!

4

1 に答える 1

0

1 つのオプションは、Rails の単一テーブル継承メカニズムと、追加のテーブル列 (高速) またはシリアル化されたハッシュ (新しいプロパティを追加する場合、新しい移行は必要ありません) のいずれかを使用して、この関係を各モデルの詳細に設定することです。 . アイデアは次のとおりです。

typeテーブルを作成している移行に列を追加して、vehicles単一のテーブル継承を使用したいことをRailsに通知します。

def change
  create_table :vehicles do |t|
    t.string :type

    # if using serialization
    t.text :parameters

    # if using custom fields
    t.integer :saddlebags
    t.integer :doors

    # ...
  end
end

Vehicle を基本クラスとして使用し、これ以降、特定の車両がその基本プロパティを継承します。

class Vehicle < ActiveRecord::Base
  validates_presence_of :num_of_wheels, :make, :model

  # if using serialization
  serialize :parameters, Hash

  # ...
end

class PassengerCar < Vehicle
end

class Motorcycle < Vehicle
end

# etc..

Operatorが車両に割り当てられると、Rails は適切なクラスを自動的に復元します。

# models/Operator.rb
class Operator < ActiveRecord::Base
  has_one :vehicle
end

# in controller action
op = Operator.new
op.vehicle = Motorcycle.new
op.vehicle.save
op.save
# op will now be assigned to a +Motorcycle+ the next time it's loaded

テーブルで追加の列を使用している場合、検証は説明どおりに機能します。ただし、それらを にシリアル化することを選択した場合parameters、最善の策は、各モデルのハッシュに対してカスタム バリデータを作成することです。parameters

于 2012-04-16T01:41:16.643 に答える