1

バックグラウンド

A対応するテーブルで名前が付けられたモデルを持つRails3アプリがありますas。今、私はBまったく同じように機能するAが、他のいくつかの関連付けとメソッド(にあるもの以外A)を持つ新しいモデルが必要です。

問題

STI(単一テーブル継承)を使用することにしました。A < BaseModelとのようなことができることはわかっていますが、という名前のテーブルを想定したコードはB < BaseModelすでにたくさんasあり、非常に多くの作業が必要になります。

だから私は、抽象的ではないB < Aところをやろうとしています。に列Aを追加しました。これでモデルは完全に機能しますが、モデルは継承について何も知らず、列を完全に無視するため、列を空にすることはできないと表示されます。行も返します。typeasBAtypeA.create!typeA.allB

私が試したこと

  • 列のデフォルト値Aを使用しますtypeこれは機能しますが、問題の一部しか解決しません
  • モデルでデフォルトのスコープを使用しますAこのアプローチの問題は、両方のモデルのすべての行を除外することです。B

質問

  • B < Aどのモデルも抽象的ではないRailsでどのように達成できますか?
  • 他に良い選択肢はありますか?
4

2 に答える 2

3

最も簡単な解決策は、新しい基本クラスを作成し、両方Aを保持してB拡張することです。

基本クラスは、そのテーブル名を現在のAテーブル ( as)を指すように設定します。

class NewBaseClass < ActiveRecord::Base
  self.table_name = `as`
end

class A < NewBaseClass
  # ...
end

class B < NewBaseClass
  # ...
end
于 2013-01-15T19:19:15.463 に答える
0

試す:

class A< ActiveRecord::Base
      self.abstract = false
end

別のアプローチ:

C私は自己完結型と呼ばれる別のモデルを作成します。すべての属性を持つテーブルが含まれます。そして最後にモデル化AB、モデルに対してポリモーフィックな has_one 関係を持ちCます。

于 2013-01-15T14:14:46.360 に答える