微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决无法在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。