Single Table Inheritance(STI)を呼び出さずにtype
という列を使用したい-type
をString
を保持する通常の列にしたいだけです。
Rails単一のテーブル継承があることを期待し、The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column 'type' is reserved for storing the class in case of inheritance.
の例外をスローすることなく、これを行うにはどうすればよいですか?
これを行う方法に関するアイデアはありますか?
In Rails 3.1 set_inheritance_column
は非推奨です。また、次のように名前としてnil
を使用することもできます。
class Pancakes < ActiveRecord::Base
self.inheritance_column = nil
#...
end
set_inheritance_column
を使用してSTI列名をオーバーライドできます。
class Pancakes < ActiveRecord::Base
set_inheritance_column 'something_you_will_not_use'
#...
end
したがって、何にも使用しない列名を選択し、set_inheritance_column
にフィードします。
私はこの質問がかなり古く、これがあなたが尋ねている質問から少し逸脱していることを知っていますが、列タイプまたはsomething_typeに名前を付けたい衝動を感じるときはいつも、タイプの同義語を検索し、代わりにそれを使用します:
いくつかの選択肢があります:種類、ソート、多様性、カテゴリ、セット、ジャンル、種、順序など
Rails 4.x
Rails 4
アプリで問題が発生しましたが、Rails 4ではset_inheritance_column
メソッドがまったく存在しないため、使用できません。
私のために働いた解決策は、次のようにActiveRecord
のinheritance_column
メソッドをオーバーライドすることにより、単一のテーブル継承を無効にすることでした:
class MyModel < ActiveRecord::Base
private
def self.inheritance_column
nil
end
end
それが役に立てば幸い!
すべてのモデルに対してこれを行いたい場合は、これを初期化子に固定できます。
ActiveSupport.on_load(:active_record) do
class ::ActiveRecord::Base
# disable STI to allow columns named "type"
self.inheritance_column = :_type_disabled
end
end