Rails API - 将.includes()的结果限制为最新创建的记录

时间:2018-02-24 17:25:32

标签: ruby-on-rails performance sqlite api crud

我想渲染某个类的所有对象,包括调用控制器的索引操作时的最新关联元素。

这是我的聊天室模型的代码。聊天室可以有很多订阅者:

class Chatroom < ApplicationRecord
   has_many :subscribers, dependent: :destroy
end

当用户访问起始页时,他应该看到每个聊天室的所有聊天室和最近创建的订阅者(不是最近关联的)。

我的控制器看起来像这样。它不起作用,而且我有点认为,有一种方法以某种方式限制(:include => :subscribers)命令左右:

class ChatroomsController < ApplicationController
   # GET /chatrooms
   def index
      @chatrooms= Chatroom.all.includes(Subscriber.where("subscriber.created_at < ?", Time.now).order('created_at DESC').first)
      render json: @chatrooms
   end
end

我很难找到如何选择正确的订阅者对象的解决方案。你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果您想热切地为每个聊天室加载最新的关联订阅者,可以将has_one与范围的关联添加到您的Chatroom模型中:

class Chatroom < ApplicationRecord
   has_many :subscribers, dependent: :destroy
   has_one :latest_subscriber, -> { order(created_at: :desc) }, class_name: 'Subscriber' 
end

包括它:

@chatrooms = Chatroom.includes(:latest_subscriber).all
  

当用户访问起始页面时,他应该看到所有聊天室和   最近创建的订户(不是最近的订户)   相关联)。

要将最近创建的订户无关联加载到特定聊天室,您应该使用单独的查询。例如:

@most_recent_subsciber = Subscriber.order(created_at: :desc).first

然后只构建JSON响应,它将由chatrooms数组组成,以便单独呈现它们,并能够为每个聊天室和最近创建的订阅者呈现最新订阅者(if you include it in render json)。