首页 > 解决方案 > 使用两个表之间的数据对视图进行排序

问题描述

我正在尝试使用来自两个表的数据对我的聊天框中的数据进行排序(有点尝试创建事件日志位置)。

这是我的聊天框:

聊天框/事件日志

我想根据日期/时间对蓝色和绿色框进行排序。这是我要排序的代码:

代码

你能指导我如何实现这一目标吗?

编辑 更新代码:

4 月 3 日更新的代码图片

stats.html.erb 文件

<%
    @objects = (@solrs + @messages).sort_by &:created_at
%>

<% @objects.each do |obj| %>
  <% if obj.is_a? Solr %>
    <!-- Solrs Partial -->
    <%= render 'messages/solr' %>
  <% else %>
   <!-- Messages Partial -->
  <%= render @messages %>
  <% end %>
<% end %>  

Solrs 内部代码部分

<% @solrs.each do |solr| %>

    <div class="row msg_container base_receive">  
        <div class="col-xs-10 col-md-10">
            <div class="messages msg_receive">
                <p class="">

                    Disease <b><%= solr.disease %></b> has been created with synonyms <b> <%= solr.synonym %></b> by <b><%= solr.user.first_name %> <%= solr.user.last_name %></b><br>

                </p>

                    <time> <%= solr.created_at.strftime("%d %b %4Y")%> • <%=solr.created_at.strftime("%I:%M%p")%></time>

            </div>
        </div>
    </div>

<% end %>  

代码内部消息部分

<div class="row msg_container base_sent">
        <div class="col-md-1 col-xs-1">
        <p><em><%= message.user.first_name %>: </em></p>
    </div>

    <div class="col-md-10 col-xs-10">
        <div class="messages msg_sent">
            <p>
                <%= message.body %>
            </p>
            <time> <%= message.created_at.strftime("%d %b %4Y")%> • <%=message.created_at.strftime("%I:%M%p")%></time>
        </div>

    </div>
</div>

solr_controller 文件

def stats
        @messages = Message.custom_display
        @message = Message.new
        @solrs = Solr.all
        @users = User.all 
 end

标签: ruby-on-rails

解决方案


要将多个模型排序在一起,首先创建两个模型的集合:

@objects = @solrs + @messages

然后,使用[sort_by]https://apidock.com/ruby/Enumerable/sort_by):

@objects.sort_by &:created_at-或者-@objects.sort_by { |obj| obj.created_at }

很确定您可以将其包装成一行,例如:

@objects = (@solrs + @messages).sort_by &:created_at

[is_a?]https://apidock.com/ruby/Object/is_a%3F)将让您单独对待每个人,这个 SO 问题很好地解决了这个问题

例子:

solr_controller.rb

def stats
  @messages = Message.includes(:user).custom_display
     @solrs = Solr.includes(:user).all
   @objects = (@solrs + @messages).sort_by &:created_at
end

[.includes]( https://apidock.com/rails/ActiveRecord/QueryMethods/includes ) 将允许您访问关联的用户而无需再次查询数据库。这是一篇很好的文章。

假设您在 /views/messages 中,如果您的文件结构不同,请进行调整

/messages/stats.html.erb

<% @objects.each do |obj| %>
  <% if obj.is_a? Solr %>
    <%= render partial: 'solr', locals: { solr: obj } %>
  <% else %>
    <%= render partial: 'message', locals: { message: obj } %>
  <% end %>
<% end %>

/messages/_solr.html.erb

<div class="row msg_container base_receive">  
  <div class="col-xs-10 col-md-10">
    <div class="messages msg_receive">
      <p>
        Disease <b> <%= solr.disease %> </b> 
        has been created with synonyms <b> <%= solr.synonym %> </b> 
        by <b> <%= solr.user.first_name %> <%= solr.user.last_name %> </b>
        <br>
      </p>
      <time>
        <%= solr.created_at.strftime("%d %b %4Y") %> • 
        <%= solr.created_at.strftime("%I:%M%p") %>
      </time>
    </div>
  </div>
</div>

/messages/_message.html.erb

<div class="row msg_container base_sent">
  <div class="col-md-1 col-xs-1">
    <p> <em> <%= message.user.first_name %>: </em> </p>
  </div>
  <div class="col-md-10 col-xs-10">
    <div class="messages msg_sent">
      <p> <%= message.body %> </p>
      <time> 
        <%= message.created_at.strftime("%d %b %4Y") %> • 
        <%= message.created_at.strftime("%I:%M%p") %>
      </time>
    </div>
  </div>
</div>

推荐阅读