web-dev-qa-db-ja.com

Rails-STIなしでtype列を使用しますか?

Single Table Inheritance(STI)を呼び出さずにtypeという列を使用したい-typeStringを保持する通常の列にしたいだけです。

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.の例外をスローすることなく、これを行うにはどうすればよいですか?

これを行う方法に関するアイデアはありますか?

77
Kvass

In Rails 3.1 set_inheritance_columnは非推奨です。また、次のように名前としてnilを使用することもできます。

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end
126
Valentin Nemcev

set_inheritance_column を使用してSTI列名をオーバーライドできます。

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end

したがって、何にも使用しない列名を選択し、set_inheritance_columnにフィードします。

20
mu is too short

私はこの質問がかなり古く、これがあなたが尋ねている質問から少し逸脱していることを知っていますが、列タイプまたはsomething_typeに名前を付けたい衝動を感じるときはいつも、タイプの同義語を検索し、代わりにそれを使用します:

いくつかの選択肢があります:種類、ソート、多様性、カテゴリ、セット、ジャンル、種、順序など

19
rii

Rails 4.x

Rails 4アプリで問題が発生しましたが、Rails 4ではset_inheritance_columnメソッドがまったく存在しないため、使用できません。

私のために働いた解決策は、次のようにActiveRecordinheritance_columnメソッドをオーバーライドすることにより、単一のテーブル継承を無効にすることでした:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

それが役に立てば幸い!

8
Itay Grudev

すべてのモデルに対してこれを行いたい場合は、これを初期化子に固定できます。

ActiveSupport.on_load(:active_record) do
  class ::ActiveRecord::Base
    # disable STI to allow columns named "type"
    self.inheritance_column = :_type_disabled
  end
end
0
Bill Lipa