无法在 rails 中发出复杂的 SQL 请求

问题描述

我有两个独立的模型 MarketOrderOnlineOrder

两个模型没有任何关系,但需要显示在一个表格中。

需要排序和分页。简单的解决方案是:

orders = (MarketOrder.all + OnlineOrder.all).sort_by(&:created_at).paginate(per_page: 50,page: params[:page])

这工作正常,但随着订单数量不断增长,它不适合。查询所有记录会导致性能大幅下降。如何正确缩小此类查询?谢谢

更新

模型没有完全相同的列,但共享一些需要在我的视图文件中显示的公共列。

MarketOrder(
  id: integer,user_id: integer,service_fee_amount: decimal,status: string,price: decimal,created_at: datetime,updated_at: datetime..
)
OnlineOrder(
  id: integer,category: string,comment: text,updated_at: datetime...
)

请注意,两个模型都是独立的,两个模型中的 Id 都是 1,2,3...1,3...

但是每个模型都与第三个模型用户(belongs_to has_many)有关系,并且每个表都包含 user_id。

根据 sort_by(&:created_at).paginate(per_page: 50,page: params[:page]) 将使用 jbuilder 准备 50 个最近的订单并发送到反应组件。要获得接下来的 50 个订单,将再次向后端发出请求。

解决方法

你可以创建一个多态表Order,应该有字段order_link_type(字符串)、order_link_id(整数)和order_created_at(日期时间)

class Order < ApplicationRecord
  belongs_to :order_link,polymorphic: true,optional: true
end

class MarketOrder < ApplicationRecord
  has_one :order,as: :order_link,dependent: :destroy
  after_save :create_order
  private
  def create_order
    return if order

    build_order(order_created_at: created_at)
  end
end


class OnlineOrder < ApplicationRecord
  has_one :order,dependent: :destroy
  after_save :create_order
  private
  def create_order
    return if order

    build_order(order_created_at: created_at)
  end
end

现在你可以做...

orders = Order.all.sort_by(&:order_created_at).paginate(per_page: 50,page: params[:page])

您可以以 order.order_link.user_id 访问视图中的字段,对于仅存在于一种类型或订单链接上的字段,您可以有条件地检索值,例如 order.order_link.try(:comment) 您可能想要 {{1 }} 到 delegate 类的一些字段,以便您可以只引用 Order

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...