gpt4 book ai didi

ruby-on-rails - 干涸具有相似数据类型的两个模型的代码

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:20 25 4
gpt4 key购买 nike

假设我有一个 Wine 和啤酒模型/ Controller ,以及一个具有很多关系的 wine_review 和 beer_review 模型。

每个表都有几乎相同的数据类型,例如,wine_review 和 beer_review 各有一个评级和评论列。 Wine 和啤酒各有名称。

我怎样才能干涸我的代码,以便他们都可以共享相同的 View 。

现在我有两个 View 做同样的事情,一个用于啤酒,一个用于 Wine 。

<% @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>

饮料会被 Wine 或啤酒代替,这取决于我当时正在渲染什么,但我不知道该怎么做。

我不能将 beverage 作为 local 传递给 partial,因为 review.beverge 会中断。

谢谢。

最佳答案

这里有几种不同的选择:

鸭子打字:

在Ruby 中,只要一个对象响应一个方法调用,那个方法调用就起作用了。因此,如果啤酒和 Wine 都有属性 :name,那么调用 @result.name 将适用于任一模型。

多态关联:

而不是 review.beer 或 review.wine。通过多态关联使 Wine 和 Beer 可审查。这也适用于评论,例如,两者都可评论。查看 acts_as_commentable 以了解其工作原理。 Railscasts 有一个 excellent screencast关于它是如何工作的。

单表继承:

您可以创建一个名为 Beverage 的对象,Wine 和 Beer 继承自该对象。这允许在一个地方放置相似的属性,并且仍然允许有小的差异。

根据您的描述,您正在寻找所有这三种可能的组合。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com