Наследство одиночной таблицы: Должны ли все классы в иерархии обладать одинаковыми свойствами?

StackOverflow https://stackoverflow.com/questions/2063972

Вопрос

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

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

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

Это было полезно?

Решение

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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top