迭代/排序来自两个具有不同属性的不同模型

时间:2013-10-02 16:42:23

标签: ruby-on-rails ruby loops for-loop iteration

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

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

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

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

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

跟进:this

3 个答案:

答案 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)。因此,可以为FirstModelSecondModel完全自定义每个部分。

答案 2 :(得分:0)

下面的内容会对你有用吗?我不确定这是不是你想要的

<% @values = @posts.collect(&post_attribute) + current_user.user_attribute %>
<% for value in @values %>
  <%= value%>
<% end %>