这感觉有点像一个加载的问题,虽然我没有时间深入研究它,但这里有一些初步的想法给你:
您可以将要显示的两种类型的项目组合到一个数组中,然后根据应该在两者之间共有的字段对这个数组进行排序(想到的是 created_at),以使它们按时间顺序排列顺序。
在视图中,您可以使用此单个集合进行迭代,然后使用帮助程序和唯一的部分以正确的格式呈现项目。这可以通过在您尝试在视图中显示对象类型时检查对象类型来完成。
类似的东西:
if item.is_a? Message
render :partial => 'message', :locals => {:message => item }
elsif item.is_a? Image
render :partial => 'image', :locals => {:image => item }
end
希望这对一些人有所帮助!
编辑:要组合数组,您可以使用“+”运算符简单地将它们附加在一起,因为 Ruby 中的数组不需要包含单个对象类型。
您的 Messages.all 和 Images.all 调用会为您提供对象数组,因此请尝试
@messages + @images
你应该有你的组合数组。
编辑#2:如果我自己写这个,我可能会像这样处理视图:
在顶层,只需将您的提要集合传递给旨在呈现单个项目的部分:
render :partial => "item", :collection => @feed
这将为@feed 中的每个项目呈现“_item.html.erb”部分。此外,它每次都会给局部变量一个名为“item”的局部变量,它是@feed 中用于该特定迭代的项目。
现在,我可能会让'_item'部分变得非常简单,像这样:
<%= display_item(item) %>
其中 display_item 是视图外的辅助方法,使用“is_a?”实现。从上面键入逻辑以选择项目的正确显示格式。
我将它分解成这样的原因是它利用了一些不错的 rails 功能(将集合传递给部分而不是自己循环集合),然后将逻辑拉出到帮助器(如果它是有道理的)是有用的,因为它简化了你的观点。尽可能将逻辑排除在视图之外通常是一种很好的做法,因为这样的逻辑可能难以测试,并且您的视图将变得非常难以阅读。