【问题标题】:activerecord where not nil in has_one and has_many relationship在 has_one 和 has_many 关系中不是 nil 的 activerecord
【发布时间】: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


    【解决方案1】:

    如果您需要获取已付款列表,则付款模型应包含信息,例如paid_on 属性。这是付款时应该设置其值的属性,而不是OrderItemfulfilled_on 属性。这是关于将信息与其相关的模型一起保存。

    那么Order 模型将有(比如说)一个paid_on 属性委托给它的关联支付。

    # in order.rb
    belongs_to :payment # I assume
    
    delegate :paid_on, to: payment
    

    OrderItem 模型将有一个 fulfilled_on 方法,定义如下:

    # in order_item.rb
    belongs_to :order
    
    def fulfilled_on
      order.paid_on
    end
    

    那么一切都应该简单得多,因为信息在正确的位置。

    【讨论】:

    • 您确定模型委托在 dB 查询中可用吗?
    • 不,您不能在查询中使用模型委托。我只是说,如果您需要知道OrderItem#fullfilled_on 日期,请参阅paid_on 日期以获取相关的支付iso 存储fullfilled_on 作为OrderItem 上的属性。因此,获取付款的查询不会查询 OrderItem,而是查询付款模型。有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多