多态关系和接口/抽象类/协议

时间:2012-02-25 03:01:19

标签: ruby-on-rails ruby ruby-on-rails-3 polymorphism polymorphic-associations

我有一个多态模型Comments,我几乎与其他所有模型相关联。我有评论索引页面,我使用模型的标题,我称之为commentable

确保commentable模型具有名为:title的方法或属性的最佳方法是什么?

在Objective-C中,我将定义一个协议,在其他语言中,我将定义一个抽象类或接口。我正在试图找出编写可维护的rails代码的最佳方法。

1 个答案:

答案 0 :(得分:1)

我会在评论模型上编写一个方法来为您完成此操作。所以在comments.rb中:

def title
  self.commentable.title if self.commentable.respond_to?(:title)
end

在您的视图中,您可以检查评论是否有标题并进行渲染,或者只是跳过渲染:

<% if @commentable.title %>
  <h2><%= @commentable.title %></h2>
<% end %>

它不完全是一个协议或接口,但在Ruby中,你不能轻易地强制对象以某种方式起作用。你使用像respond_to这样的东西?看看他们是否这样做,如果是,那么你就行动了。