我有三种型号:
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_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
子句,以便在各个列(包括该日期)上进行排序。
我不确定该如何表达。有什么想法吗?
预先感谢
答案 0 :(得分:0)
如果您需要获取已付款项列表,则“付款”模型应包含以下信息: paid_on
属性。这是应在付款时设置其值的属性,而不是fulfilled_on
的{{1}}属性。这是关于将信息与相关模型保持在一起。
然后,OrderItem
模型将具有一个Order
属性,该属性被委派给与其关联的付款。
paid_on
# in order.rb
belongs_to :payment # I assume
delegate :paid_on, to: payment
模型将具有一个OrderItem
方法,其定义如下:
fulfilled_on
然后所有内容都应该简单得多,因为信息位于正确的位置。