我有一个活动菜单,它应该显示来自两个不同模型的项目,这些模型按created_at排序。
我知道如何从单个模型中迭代和排序项目,但是当我尝试组合结果时。然后我无法迭代,因为属性会有所不同。所以下面没有意义。
<% @post_and_events = @posts + current_user.events %>
<% for both in @post_and_events %>
<%= both.? %>
<% end %>
<% end %>
由于帖子与事件有不同的属性。
在我的脑海中,我正在考虑单独对它们进行排序,但是我不确定如何将@post
和@events
显示为一个组,而不是显示一个然后显示另一个结果。< / p>
跟进:this
答案 0 :(得分:1)
你可以试试这个:
<% @post_and_events = (@posts + @events).sort_by{|pe| pe.created_at} %>
如果你想为每个人显示不同的html部分:
<% @post_and_events.each do |pe| %>
<% if pe.is_a? Post %>
...
<% else %>
...
<% end %>
答案 1 :(得分:1)
您应该在控制器中而不是在视图中创建要使用的数据集。你可以这样做:
first_thing = FirstModel.all
second_thing = SecondModel.all
@both_things = (first_thing + second_thing).sort_by { |thing| thing.created_at }
您可以在视图中迭代数据集,使用以下内容选择性地显示属性:
<% @both_things.each do |thing| %>
<%= thing.attribute_one if thing.is_a? FirstModel %>
<%= thing.attribute_two if thing.is_a? SecondModel %>
<% end %>
如果你有很多不同的可能性/属性,这可能会失控。在这种情况下,我可能会建议设置两个部分_show_thing_one.html.erb
和_show_thing_two.html.erb
。在您的视图中,根据显示的内容选择性地使用部分:
<% @both_things.each do |thing| %>
<% if thing.is_a?(FirstModel) %>
<%= render 'show_thing_one', thing: thing %>
<% elsif thing.is_a?(SecondModel) %>
<%= render 'show_thing_two', thing: thing %>
<% end %>
<% end %>
在每个部分中,您可以使用变量thing
来引用要传入的项目(这是thing: thing
行的render
部分正在执行的操作,您可以阅读更多关于here)。因此,可以为FirstModel
或SecondModel
完全自定义每个部分。
答案 2 :(得分:0)
下面的内容会对你有用吗?我不确定这是不是你想要的
<% @values = @posts.collect(&post_attribute) + current_user.user_attribute %>
<% for value in @values %>
<%= value%>
<% end %>