наследование одной таблицы: должны ли все классы в иерархии иметь одинаковые свойства? - PullRequest
2 голосов
/ 14 января 2010

У меня есть следующее

class Item < ActiveRecord::Base
end

class Talk < Item
end

с миграцией

class CreateItems < ActiveRecord::Migration
  def self.up
    create_table :items do |t|
      t.string :type
      t.string :name
      t.text :description
      t.time :start_time
      t.time :duration
      t.timestamps
    end
  end

  ...
end

По умолчанию свойство description будет доступно в классах Item и Talk. Есть ли способ ограничить свойство, чтобы оно было доступно только классу Talk?

1 Ответ

2 голосов
/ 14 января 2010
class Item < ActiveRecord::Base
  def duration
    raise NoMethodError
  end

  def duration=(value)
    raise NoMethodError
  end
end

class Talk < Item
  def duration
    read_attribute(:duration)
  end

  def duration=(value)
    write_attribute(:duration, value)
  end
end

Ты всегда мог это сделать, но это много работы даром. Что хуже всего случится, когда вы прочитаете длительность на предмете? Вы получите ноль, что вскоре приведет к сбою. Вам не нужно беспокоиться об этих типах проблем в Ruby.

При необходимости вы можете создать модуль и включить модуль в два класса для общего поведения и отбросить STI.

...