假设我有一个葡萄酒和啤酒模型/控制器,还有一个葡萄酒评论和啤酒评论模型,它们之间有很多关系。
每个表都有几乎相同的数据类型,例如,wine_review和beer_review都有一个rating和comment列。
酒和啤酒各有名字。
我怎样才能干掉我的代码,让它们可以共享相同的视图。
现在我有两种观点,一种是啤酒,一种是葡萄酒。

<% @wine_reviews.each do |review| -%>
  <ul>
    <li><%= link_to review.wine.name, review.wine %></li>
    <li><%= review.rating %></li>
    <li><%=h review.comment %></li>
  </ul>
<% end -%>

<% @beer_reviews.each do |review| -%>
  <ul>
  ....
  ....

我真正想做的是
<li><%= link_to review.beverage.name, review.beverage %></li>

在哪里饮料会被替换成葡萄酒或啤酒取决于我当时呈现的是什么,但我不知道如何做到这一点。
我不能把饮料作为本地饮料传给一部分作为评论。贝弗奇会破产的。
谢谢。

最佳答案

这里有几个不同的选项:
鸭子打字:
在ruby中,只要一个对象用work响应一个方法调用,这个方法调用就行。因此,如果啤酒和葡萄酒都有一个属性:name,那么调用@result.name对这两种模式都有效。
多态性关联:
而不是评论啤酒或评论葡萄酒。通过多态性关联使葡萄酒和啤酒可以被审查这也适用于评论,例如,两者都可以评论看看这是如何运作的Railscasts对其工作原理有一个excellent screencast说明。
单表继承:
您可以创建一个名为Beverage的对象,葡萄酒和啤酒从中继承这允许一个地方放置相似的属性,但仍然允许小的差异。
从你的描述来看,这三者可能是一个组合。

关于ruby-on-rails - 干燥具有相似数据类型的两个模型的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1792005/

10-13 01:34