0

我有一个活动菜单,它应该显示来自按 created_at 排序的两个不同模型的项目。

我知道如何从单个模型中迭代和排序项目,但是当我尝试组合结果时。然后我无法迭代,因为属性会有所不同。所以下面没有意义。

<% @post_and_events = @posts + current_user.events %>
  <% for both in @post_and_events %>
    <%= both.? %>
  <% end %>
<% end %>

由于帖子具有与事件不同的属性。

在我的脑海中,我正在考虑分别对它们进行排序,但是我不确定如何作为一个组显示@post@events排序,而不是显示一个然后另一个的结果。

跟进:这个

4

3 回答 3

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正在做的事情,您可以在此处阅读更多信息)。所以每个部分都可以为FirstModelor完全定制SecondModel

于 2013-10-02T17:00:25.007 回答
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 %>
于 2013-10-02T16:51:33.727 回答
0

像下面这样的东西对你有用吗?我不确定这是否是您正在寻找的

<% @values = @posts.collect(&post_attribute) + current_user.user_attribute %>
<% for value in @values %>
  <%= value%>
<% end %>
于 2013-10-02T16:48:52.497 回答