0

私は Rails 3.2.2 アプリケーションで Ruby 1.9.3 を使用しており、型を含める必要がある多数の has_many 関連付けを扱っています。例えば:

  • ユーザーは多くの航空機を持っています。航空機は特定のタイプ (Cessna 172) です。
  • ユーザーは多くのライセンスを持っています。ライセンスは特定の種類のものです (プライベート パイロット ライセンス)。
  • ライセンスには、_多くの評価があります。評価は特定のタイプのものです (シングル エンジン ピストン クラス評価)。

私の問題は、これらすべてのクラスに名前を付けることです。現在、ユーザーの関連付けにはAircraftLicenseおよびという名前が付いていますRatingが、それでも型クラスに名前を付ける必要があります。私は最初にそれらに名前を付けましAircraftTypeたがLicenseTypeRatingTypeこれは私にはにおいがしました。

現在、私はこれらすべての型クラスを専用のモジュールにTypes持っているので、私の型クラスは という名前Types::Aircraftになっています。Types::LicenseTypes::Rating

この種の問題に対する慣習や標準的な慣行はありますか?

アップデート:

航空機タイプのリストは定期的に更新されるため、これらをデータベースに登録する必要があります。ライセンスの種類と評価はそれほど頻繁には変更されませんが、追加、変更、または削除する必要がある場合は、データベースに登録しておくことをお勧めします。この種のルールは、クラス自体でそれらを静的に定義することを除外します。

4

1 に答える 1

2

型はモデルと密接に関連付けられているため、型をクラス メソッドとしてモデルに配置できます。何かのようなもの:

class Aircraft < ActiveRecord::Base
  def self.XTypes
     ['Cessna 172','Cessna 152','Boeing 747']
  end
end

「type」は使用しないでください。Rails は単一テーブルの継承用に予約しているため、実際には「Types」は危険でさえあるかもしれませんが、型を持つすべてのモデルで属性名を同じにしておくとよいでしょう。 、少なくとも DRYer コードの可能性を開きます。XType を持つモデルの選択要素を作成するビュー ヘルパーのように、XType を持つすべてのモデル間でコードを共有できる可能性があります。

したがって、通常は次のように XType を使用します。

<%= f.select 'xtype', Aircraft.XTypes %>

XType のリストが大きくなるほど、それらが改訂/追加/削除される可能性が高くなるため、おそらくそれらを別のモデルに入れて has_one 関係でリンクすることを検討する必要がありますが、それらがかなり静的である場合、上記のアプローチはおそらく大丈夫です。

アップデート:

単一テーブルの継承は、それか単純な has_one 関係のいずれかである可能性があると思います。しかし、これらすべてのタイプを単一のエンティティに凝縮したいように聞こえるので、STI が必要になる場合があります。

class mytype < ActiveRecord::Base; end
class AircraftType < mytype; end
class LicenseType < mytype; end

mytype モデルに「type」という文字列属性を追加し、値「AircraftType」または「LicenseType」を入力するだけです。これで、すべてのタイプに対応できる 1 つのモデルができました。つまり、ライセンス レコードを編集していて、LicenseTypes の選択要素が必要な場合は、次のようにします。

<%= f.select 'type', LicenceType.all().map {|t|, [t.id, t.description] }

航空機を編集していた場合:

<%= f.select 'type', AircraftType.all().map {|t|, [t.id, t.description] }

これは、ベース mytype モデルに属性「説明」があることを前提としています

于 2012-04-23T16:50:37.387 に答える