我需要对记录集进行一次查询并获取许多类型对象的列表。
在这个例子中,我将使用博客文章,博客文章有许多不同的类型。
基础帖子:
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
虽然这有效,但检查类型感觉不对,因为这违反了鸭型原则。我认为有一个更好的方法来做同样的事情。
实现同样目标的更好的设计是什么,或者我只是在考虑我的设计?
答案 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