Как реализовать Активное Рекордное наследование в Ruby on Rails?

Нет. Я предлагаю вам изменить сигнатуру вашей первой функции, чтобы она возвращала исключение, а не бросала его, и оставляла оператор throw в вашей второй функции. Это будет радовать компилятор и пахнет не так плохо.

38
задан lillq 20 November 2009 в 07:42
поделиться

3 ответа

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
16
ответ дан 27 November 2019 в 03:20
поделиться

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/

66
ответ дан 27 November 2019 в 03:20
поделиться

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.

7
ответ дан 27 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: