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)}
所以现在每个模型都负责自己的业务。
我有三个 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)}
所以现在每个模型都负责自己的业务。