Rails — use type column without STI?

前端 未结 5 1397
闹比i
闹比i 2020-11-27 15:36

I want to use a column called type without invoking Single Table Inheritance (STI) - I just want type to be a normal column that holds a Stri

相关标签:
5条回答
  • 2020-11-27 15:58

    You can override the STI column name using set_inheritance_column:

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

    So pick some column name that you won't use for anything and feed that to set_inheritance_column.

    0 讨论(0)
  • 2020-11-27 16:02

    In Rails 3.1 set_inheritance_column is deprecated, also you can just use nil as a name, like this:

    class Pancakes < ActiveRecord::Base
        self.inheritance_column = nil
        #...
    end
    
    0 讨论(0)
  • 2020-11-27 16:10

    If you want to do this for all models, you can stick this in an initializer.

    ActiveSupport.on_load(:active_record) do
      class ::ActiveRecord::Base
        # disable STI to allow columns named "type"
        self.inheritance_column = :_type_disabled
      end
    end
    
    0 讨论(0)
  • 2020-11-27 16:12

    Rails 4.x

    I encountered the problem in a Rails 4 app, but in Rails 4 the set_inheritance_column method does not exist at all so you can't use it.

    The solution that worked for me was to disable the single table inheritance by overriding ActiveRecord’s inheritance_column method, like this:

    class MyModel < ActiveRecord::Base
    
      private
    
      def self.inheritance_column
        nil
      end
    
    end
    

    Hope it helps!

    0 讨论(0)
  • 2020-11-27 16:15

    I know this question is rather old and this deviates a bit from the question you are asking, but what I always do whenever I feel the urge to name a column type or something_type is I search for a synonym of type and use that instead:

    Here are a couple alternatives: kind, sort, variety, category, set, genre, species, order etc.

    0 讨论(0)
提交回复
热议问题