【问题标题】:Rails 4.2: has_many using condition from belongs_toRails 4.2:has_many 使用来自 belongs_to 的条件
【发布时间】:2015-07-22 12:08:29
【问题描述】:
我有三个 ActiveRecord。
订单,其中有_many OrderItems。还有一个名为 status 的字段。
OrderItem,它属于一个订单和一个脚本
脚本,其中有_many OrderItems
我想在脚本模型中设置 has_many,以便只给出属于状态为“已付款”的订单的 OrderItem。
我是 Rails 新手,这不是我的代码库,所以我有点挣扎。我已经看到其他答案使用 :include 和 :conditions 关键字,但在 rails 4.2 中都无效
任何帮助都会很棒。
【问题讨论】:
标签:
ruby-on-rails
ruby
ruby-on-rails-4
activerecord
has-many
【解决方案1】:
我会尝试通过确保模型不会过多地参与定义其他模型的行为来保持事情的纯洁性。
首先定义 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)}
所以现在每个模型都负责自己的业务。
【解决方案2】:
以下是设置 has_many :order_items 的方法,其中仅包含属于已付款订单的商品:
class Script < ActiveRecord::Base
has_many :order_items, -> {
includes(:order).where(orders: {status: 'paid'})
}
end