Rails 4.2:has_many 使用来自 belongs_to 的条件

Rails 4.2: has_many using condition from belongs_to

我有三个 ActiveRecords。 订单,其中 has_many 个 OrderItems。还有一个名为状态的字段。 OrderItem,其中 belongs_to 一个订单和一个脚本 脚本,其中 has_many OrderItems

我想在脚本模型中设置 has_many,以便只给出属于状态为 'paid' 的订单的 OrderItems。

我是 rails 的新手,这不是我的代码库,所以我有点吃力。我看到其他答案使用 :include 和 :conditions 关键字,但在 rails 4.2

中均无效

任何帮助都会很棒。

设置 has_many 的方法如下:order_items 仅包含属于已付款订单的项目:

class Script < ActiveRecord::Base
  has_many :order_items, -> {
    includes(:order).where(orders: {status: 'paid'})
  }
end

我会尝试通过确保模型不会过多地参与定义其他模型的行为方式来保持事情的纯粹性。

首先为 Order 定义一个范围来定义你所说的 "paid"。

def self.has_been_paid
  where(status: "Paid")
end

然后您可以将 OrderItems 与已付款订单相关联。

belongs_to :paid_order, -> {merge(Order.has_been_paid)}, :class_name => "Order", :foreign_key => :order_id

...和范围...

def self.for_paid_orders
  joins(:paid_order)
end

然后对于脚本:

has_many :order_items, -> {merge(OrderItem.for_paid_orders)}

所以现在每个模型都负责自己的业务。