4

すべて同じテーブルから取得するいくつかのモデルを作成しようとしています。各モデルのテーブル レコードを制限するにはどうすればよいですか? データ構造を変更するように言われる前に、これは、私が制御できない既存のバッキング DB からプルしているレポート アプリケーションです。

私のテーブルは次のようになります。

Vehicle_Table
id vehicle_type name
--------------------
1  Car          Foo
2  Car          Bar
3  Motorcycle   Baz
4  Car          Barf

そして、次のような車とオートバイのモデルを構築したいと思います。

class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'

end

class Motorcycle < ActiveRecord::Base
  set_table_name 'Vehicle_Table'

end

しかし、「Active Record さん、motorcycle モデルで vehicle_type =motorcycle のレコードのみが必要です」と言う方法がわかりません。

これは明らかなことだと思いますが、私の Google 検索はすべて、モデルを特定のレコードのサブセットに制限するのではなく、モデルのサブセットを検索する方法を返します。

4

2 に答える 2

5

これは、単一テーブル継承 (STI) と呼ばれます。

typeテーブルに名前が付けられた列がある場合、それは自動的に機能する可能性があります。ただし、Rails が型を区別するために使用するこの列名は変更できます。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

単一テーブルの継承

Active Record では、デフォルトで「type」という名前の列にクラスの名前を格納することで継承を許可します (Base.inheritance_column を上書きすることで変更できます)。これは、次のような継承を意味します。

class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end

Firm.create(:name => "37signals") を実行すると、このレコードは会社テーブルに type = "Firm" で保存されます。その後、Company.where(:name => '37signals').first を使用してこの行を再度フェッチすると、Firm オブジェクトが返されます。

だから、このコードを試してください

class Car < ActiveRecord::Base
  set_table_name 'Vehicle_Table'
  self.inheritance_column = :vehicle_type
end
于 2012-02-14T23:55:28.590 に答える