Rails 4.2:has_many使用belongs_to中的条件

时间:2015-05-11 20:23:17

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord has-many

我有三个ActiveRecords。 Order,has_many OrderItems。还有一个名为status的字段。 OrderItem,属于Order和Script 脚本,has_many OrderItems

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

我是rails的新手,这不是我的代码库,所以我有点挣扎。我已经看到其他答案使用:include和:conditions关键字,但两者都不适用于rails 4.2

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

我会尝试通过确保模型不太过于参与定义其他模型的行为来保持一些纯粹的东西。

首先定义Order的范围,以定义您的意思"付费"。

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)}

所以现在每个模型都会照顾自己的业务。

答案 1 :(得分:0)

以下是如何设置仅包含属于付费订单的商品的has_many:order_items:

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