【发布时间】:2020-07-01 16:28:04
【问题描述】:
我有三个模型:
class Payment < ActiveRecord::Base
...
has_one :order
end
class Order < ActiveRecord::Base
...
has_many :items, class_name: "OrderItem"
end
class OrderItem < ActiveRecord::Base
...
OrderItem 有一个名为fulfilled_at 的列,其中填充了付款完成的日期,否则为空。
我需要进行 activerecord 查询以获取所有已付款。
结果必须是ActiveRecord_Relation,因为我将在其上使用will_paginate,并且我还需要能够按日期排列order。
这是我尝试过的:
通过查询OrderItem 获取已排序的付款列表,然后使用where( 'id in ?' 获取付款,但随后它们未排序,我尝试使用decode 对它们进行排序,但显然不存在在postgres中
filled_items = OrderItem.includes(:order).where.not(fulfilled_at: nil)
filled_items = filled_items.order("fulfilled_at #{filter_params[:dir]}") if filter_params[:sort] == 'date'
paid_payments = filled_items.map(&:order).compact.map(&:payment_id)
logger.debug(" paid_payments: #{paid_payments}")
@payments = Payment.includes(:user, order: [:items]).where( "id in (?)", paid_payments)
if filter_params[:sort] == 'date'
i = 0
decoder = paid_payments.zip(Array.new(paid_payments.size){i+=1}).flatten
@payments = @payments.order("decode (id, #{decoder.join(', ')})")
我尝试在一个班轮中完成所有工作:
Payment.includes(order: [:items]).where.not(order: {items: {fulfilled_at: nil}})
但是这里生成的查询什么也没返回,结尾是:WHERE ("order"."order_id" != '--- :fulfilled_at:')
我需要,稍后在代码中添加 order 子句,以对包括此日期在内的各个列进行排序。
我不知道该如何表达。有什么想法吗?
提前致谢
【问题讨论】:
标签: ruby-on-rails postgresql activerecord