1

如果我有这样的模型:

class Media
  attr_reader :title, :created_at
end

class Video < Media
end

class Picture < Media
  attr_reader :image_url
end

因此,在Picture类中有一个属性不应该存在于超类中。当您想要检索所有媒体时,人们通常会做什么?你想在方法上抛出异常image_url吗?或者你会如何重新建模?

4

1 回答 1

2

如果您对所有媒体都感兴趣,那么您不应该关心它是视频还是图片。换句话说,接受集合的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
于 2012-04-22T16:14:28.737 回答