如果我有这样的模型:
class Media
attr_reader :title, :created_at
end
class Video < Media
end
class Picture < Media
attr_reader :image_url
end
因此,在Picture
类中有一个属性不应该存在于超类中。当您想要检索所有媒体时,人们通常会做什么?你想在方法上抛出异常image_url
吗?或者你会如何重新建模?
如果我有这样的模型:
class Media
attr_reader :title, :created_at
end
class Video < Media
end
class Picture < Media
attr_reader :image_url
end
因此,在Picture
类中有一个属性不应该存在于超类中。当您想要检索所有媒体时,人们通常会做什么?你想在方法上抛出异常image_url
吗?或者你会如何重新建模?
如果您对所有媒体都感兴趣,那么您不应该关心它是视频还是图片。换句话说,接受集合的Media
方法不应该调用Media
后代的任何方法。如果您需要所有图片,请使用Picture
,不要过度概括。
如果您仍然需要在区分类型的同时处理所有媒体,则可以在类型上进行分支。
def process_media media
media.each do |m|
if m.is_a? Picture
# work with picture
elsif m.is_a? Video
# work with video
end
end
end
另一种方法是使用鸭子类型。也就是说,如果它有一个方法image_url
,那么它一定是某种图片。
def process_media media
media.each do |m|
if m.respond_to? :image_url
# work with picture
elsif m.respond_to? :bitrate
# work with video
end
end
end