activerecord在has_one和has_many关系中不为nil

时间:2020-07-01 16:28:04

标签: ruby-on-rails postgresql activerecord

我有三种型号:

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子句,以便在各个列(包括该日期)上进行排序。

我不确定该如何表达。有什么想法吗?

预先感谢

1 个答案:

答案 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

然后所有内容都应该简单得多,因为信息位于正确的位置。

相关问题