我在单表继承层次结构中有类看起来像这样:
# 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)
答案 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
这是不太理想的,因为它会占用您可能想要实际保存的数据,但由于错误而丢失。