2

我有以下

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

4

1 回答 1

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

你总是可以这样做,但这是徒劳的。当您阅读项目的持续时间时,最糟糕的情况是什么?您将返回 nil,这将在此后不久导致崩溃。在 Ruby 中,您不需要那么担心这些类型的问题。

如果需要,您可以创建一个模块并将该模块包含在两个类中,以实现共享行为,然后删除 STI。

于 2010-01-14T13:49:49.483 回答