0

現在、私のレールアプリには、異なる製品であるいくつかのクラスがあります。

例えば一例ですCircuits

私がやりたいことは、という名前の新しいクラスを作成し、Serviceすべての個々の製品モデルをそれから継承させることです。

以前の私のcircuit.rbモデルは

class Circuit < ActiveRecord::Base

でも今は

class Circuit < Service

そして、新しい `Services1 クラスを作成しました。単純に:

class Service < ActiveRecord::Base
end

circuit_controller.rbにはいくつかの機能がありますが、最も簡単なのはlist

def list
  conditions = []
  conditions = ["organisation_id = ?", params[:id]] if params[:id]
  @circuits = Circuit.paginate(:all, :page => params[:page], :conditions => conditions, :per_page => 40)
end

circuitしかし、モデルを継承するように変更するservicesと、回路リストビューが空になり、予期していませんでした。

私のservicesテーブルには、製品のタイプを保存するためのフィールドが含まれていtypeますが、現時点ではテーブルは空です。

マルチテーブル継承は最善の方法ですか? アプリは非常に大きいので、この変更を実装するために多くのコードをリファクタリングする必要はありません。

単一テーブルの継承は絶対にダメなので、何らかの関連付けの方が良いのではないかと思っています。

アップデート

このブログ投稿に従ってみました:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

だから私は追加しました

belongs_to :service

私の個々の製品モデルに、次にservices モデルに

SUBCLASSES = [:circuit, :domain]
  SUBCLASSES.each do |class_name|
    has_one class_name
  end
end

次に、service_controller.rb

def list
  @services = Service.all(:include => Service::SUBCLASSES)
end

最後に、リスト ビューで変数を調べてデバッグしようとしました@servicesが、クエリが空のservicesテーブルで実行さcircuitsれているため空domainsです。

4

1 に答える 1

0

私の見解 : 複数テーブルの継承を使用する場合でも、(理想的には) すべての共通変数を Service テーブルに入れるタスクを作成する必要があると思います。共通変数が親テーブルにない場合、複数テーブルの継承はその目的を果たしません。

さらに、既存のモデルにどれだけの珍しい属性があるかによっても異なります。それがない場合は、むしろ STI を使用します。テーブルの構造が同じ場合は、むしろ STI を使用します。

しかし、私はそれがすべてのモデルで同じではないと仮定しています.

于 2013-09-12T11:00:45.653 に答える