适当的协会设计

时间:2013-05-19 20:20:21

标签: ruby-on-rails ruby

我需要对记录集进行一次查询并获取许多类型对象的列表。

在这个例子中,我将使用博客文章,博客文章有许多不同的类型。

基础帖子:

class Post < ActiveRecord::Base
  belongs_to :postable, :polymorphic => true
  attr_accessible :body, :title
end

音频发布:

class AudioPost < ActiveRecord::Base
  attr_accessible :sound
  has_one :postable, :as => :postable
end

图文:

class GraphicPost < ActiveRecord::Base
  attr_accessible :image
  has_one :postable, :as => :postable
end

这将允许我做这样的事情。

@post = Post.all
@post.each do |post|
  post.title
  post.body
  post.postable.image if post.postable_type == "GraphicPost"
  post.postable.sound if post.postable_type == "AudioPost" 
end

虽然这有效,但检查类型感觉不对,因为这违反了鸭型原则。我认为有一个更好的方法来做同样的事情。

实现同样目标的更好的设计是什么,或者我只是在考虑我的设计?

1 个答案:

答案 0 :(得分:2)

查看我的评论。

无论如何,如果你想要多态,我会在模型中编写逻辑:

class Post
  delegate :content, to: :postable


class AudioPost
  alias_method :sound, :content


class GraphicPost
  alias_method :image, :content

你想要渲染的图像与声音不同,对于那部分,我会使用帮助器:

module MediaHelper
  def medium(data)
    case # make your case detecting data type
    # you could print data.class to see if you can discriminate with that.

并在视图中调用

= medium post.content