Наследство одиночной таблицы: Должны ли все классы в иерархии обладать одинаковыми свойствами?
-
20-09-2019 - |
Вопрос
У меня есть следующее
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.
При необходимости вы можете создать модуль и включить модуль в двух классах, для общего поведения и отбросить ИППП.
Не связан с StackOverflow