如何在Ruby on Rails中将特定属性的使用限制为特定的子类

时间:2017-10-09 22:34:15

标签: ruby-on-rails ruby ruby-on-rails-5

我在单表继承层次结构中有类看起来像这样:

# Table name: blocks
#
#  video_name    :string  
#  text_name     :string           
#

class Block < ApplicationRecord
   ...
end

class VideoBlock < Block
end

class TextBlock < Block
end

blocks表包含Block子类将使用的所有属性。

我想指定您的访问方式:

    仅当您处理video_name个对象时才
  • VideoBlock 仅当您处理text_name个对象
  • 时才
  • TextBlock

我如何在Ruby on Rails中执行此操作? (具体使用5.x)

2 个答案:

答案 0 :(得分:1)

您可以通过创建自定义设置器和getter来执行此操作:

class MyError < StdError; end

class Block < ApplicationRecord
  def video_name
    raise MyError unless video?
    super
  end

  def video_name=(value)
    raise MyError unless video?
    super
  end

  def video?
    self.class.name == 'VideoBlock'
  end
end

答案 1 :(得分:1)

如果你想在子类中解决这些问题,你需要决定如何处理它。你是想忽略放在那里的数据,还是想要吓坏你并且着火?

为了着火:

class Video
  validates :text_name,
    absence: true
end

这将通过提高验证异常来阻止此子类中的各种属性。

忽略:

class Video
  def text_name=(v)
    # Ignored
  end
end

这是不太理想的,因为它会占用您可能想要实际保存的数据,但由于错误而丢失。