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

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

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

     

由于post具有不同的事件属性。

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

跟进: 这个

你可以试试这个:

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

您应该在控制器中而不是在视图中创建要使用的数据集。 你可以用这样的东西做到这一点:

 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 。 在您的视图中,根据显示的内容选择性地使用partial:

 <% @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来引用传入的项目(这就是render线的thing: thing部分正在做什么,你可以在这里阅读更多内容)。 因此,可以为FirstModelSecondModel完全自定义每个部分。

下面的东西会对你有用吗? 我不确定这是不是你要找的东西

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