在ruby模型中创建帮助程序以便快速访问

时间:2012-01-25 20:03:35

标签: ruby ruby-on-rails-3

我有一个视频模型,其中包含许多不同的视频编码版本。每个编码版本具有相同的字段。架构看起来像这样:

Videos:
 id: integer
 url: string
 version_mp4_id: integer
 version_mp4_encoding_status: string
 version_mp4_dimensions: string
 version_ogg_id: integer
 version_ogg_encoding_status: string
 version_ogg_dimensions: string

现在,只要说 v.version_mp4_id = 1 就很容易了,但是我试图让它变得更聪明一点,这样我就可以把它们当作自己的实体对待仍然将所有信息保存在同一个表中。

所以,我写了一个名为 VideoVersion 的类,它是视频的嵌套类。它看起来像这样:

class VideoVersion
  attr_accessor :id, :url, :encoding_status, :dimensions

  def initialize(video, format)
    @video = video
    @format = format
    @id = @video.read_attribute("version_#{format}_id")
    @url = @video.read_attribute("version_#{format}_url")
    @dimensions = @video.read_attribute("version_#{format}_dimensions")
    @encoding_status = @video.read_attribute("version_#{format}_encoding_status")
  end

  def attributes
    return {
      "version_#{@format}_id" =>  @id,
      "version_#{@format}_url" =>  @url,
      "version_#{@format}_dimensions" =>  @dimensions,
      "version_#{@format}_encoding_status" =>  @encoding_status
    }
  end
  alias :attrs :attributes

  def save!
    @video.update_attributes(attributes)      
  end

end

我在视频类上有三种方法,如下所示:

def version(format)
  raise UnsupportedFormat unless FORMATS.include?(format)
  return VideoVersion.new(self, format)
end

def mp4
  version('mp4')
end

def ogg
  version('ogg')
end

这允许我说 v.mp4.id 并让它返回正确的信息。这一切都很好,花花公子。

尝试以相同方式更改值时,或者直接对视频对象进行更改,然后通过v.mp4快捷方式进行访问时,会出现问题。例如:

v = Video.find(1)
vv = VideoVersion.new(v, 'mp4')
puts vv.encoding_status
=> 'started'
v.version_mp4_encoding_status = 'finished'
puts vv.encoding_status
=> 'started'
v.mp4.encoding_status = 'pending'
puts v.version_mp4_encoding_status
=> 'finished'

由于视频是按值传递的,因此原始对象不会受到影响。这很明显。

长话短说,我试图弄清楚是否有更好的方法来完成快捷方式而不需要额外的麻烦和问题。方法遗失?别的什么?或者,我只是懒惰并使我的代码过于复杂......:)

提前致谢!

1 个答案:

答案 0 :(得分:1)

Jeremy,我不确定我是否完全了解您的几种方法,但在我看来,您可以将VideoVersion类的所有功能都添加到您的视频类中。我假设您的问题更多是'嵌套'类问题。