How to implement Active Record inheritance in Ruby on Rails?

后端 未结 3 1183
花落未央
花落未央 2020-12-01 02:52

How to implement inheritance with active records?

For example, I want a class Animal, class Dog, and class Cat.

How would the model and the database table ma

相关标签:
3条回答
  • 2020-12-01 03:26

    Models:

    class Animal < ActiveRecord::Base; end
    class Dog < Animal; end
    class Cat < Animal; end
    

    Migration:

    class CreateAnimals < ActiveRecord::Migration
      def self.up
        create_table :animals do |t|
          # Other attributes...
          t.string :type
        end
      end
    
      def self.down
        drop_table :animals
      end
    end
    
    0 讨论(0)
  • 2020-12-01 03:28

    Rails supports Single Table Inheritance.

    From the AR docs:

    Active Record allows inheritance by storing the name of the class in a column that by default is named "type" (can be changed by overwriting Base.inheritance_column). This means that an inheritance looking like this:

    class Company < ActiveRecord::Base; end   
    class Firm < Company; end  
    class Client < Company; end   
    class PriorityClient < Client; end
    

    When you do Firm.create(:name => "37signals"), this record will be saved in the companies table with type = "Firm". You can then fetch this row again using Company.find(:first, "name = ‘37signals’") and it will return a Firm object.

    If you don‘t have a type column defined in your table, single-table inheritance won‘t be triggered. In that case, it‘ll work just like normal subclasses with no special magic for differentiating between them or reloading the right type with find.

    A pretty good tutorial is here: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

    0 讨论(0)
  • 2020-12-01 03:41

    ActiveRecord supports mapping inheritance hierarchies to a single table(Single-table inheritance. Table would have a column type which stores name of actual class and is used to select other class-specific columns.

    It is possible to implement multi-table inheritance mapping, as shown here, but this particular way is not portable, AFAIK.

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