【问题标题】:Iterating/Sorting results from two different models with different attributes对具有不同属性的两个不同模型的结果进行迭代/排序
【发布时间】:2013-10-09 03:36:06
【问题描述】:

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

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

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

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

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

跟进:this

【问题讨论】:

  • 您的@post_and_events 包含帖子和用户?也许您的意思是第一行中的 current_user.something?
  • 正确,我已经更正了。

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


【解决方案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 %>

【讨论】:

    【解决方案2】:

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

    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 来引用传入的项目(这就是render 行的thing: thing 部分正在做的事情,您可以阅读更多关于here 的信息) .所以每个部分都可以完全定制为FirstModelSecondModel

    【讨论】:

    • 或者:thing.try(:attribute_one) || thing.attribute_two 。如果第一个属性不存在,它将返回 nil 并尝试第二个选项。
    • 是的,如果是非此即彼的情况(例如 FirstModel 具有 name 属性,但 SecondModel 具有 title 属性)。
    • 不错的答案顺便说一句!进展顺利。
    【解决方案3】:

    以下内容对您有用吗?我不确定这是不是你要找的东西

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2023-04-09
      • 2018-12-31
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多