单表继承:层次结构中的所有类都必须具有相同的属性吗?

时间:2010-01-14 12:24:28

标签: ruby-on-rails activerecord single-table-inheritance

我有以下

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类可用?

1 个答案:

答案 0 :(得分:2)

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。