【发布时间】:2014-10-16 10:24:26
【问题描述】:
我遇到了排除数据的问题,如果关联数据之一的属性 x 具有值“a”。
例子:
class Order < ActiveRecord::Base
has_many :items
end
class Item < ActiveRecord::Base
belongs_to :order
validate_presence_of :status
end
查询应返回所有不具有status = 'paid'(status !='paid')的商品的订单。
由于 1:n 关联,一个订单可以有多个项目。并且其中一个 Itmes 可以具有 status = 'paid'。这些订单必须从我的查询结果中排除,即使订单有其他状态不同于“已付款”的商品。
我将如何解决这个问题:
paid_items = Items.where(status: 'paid').pluck(:order_id)
orders_wo_paid = Order.where('id NOT IN (?)', paid_items)
是否有 ActiveRecord 解决方案,可以在一个查询中解决此问题。 或者有其他方法可以解决这个问题吗?
我不是在寻找红宝石解决方案,例如:
Order.select do |order|
!order.items.pluck(:status).include?('paid')
end
感谢您的想法和灵感。
【问题讨论】:
-
您可以使用嵌套的 sql 查询来解决它,但我认为它不会比您自己的解决方案更有效率,而且它的可读性肯定会降低。我个人会选择你所拥有的。
-
或者使用左连接 + 分组 + 计数,但是左连接在 ActiveRecord 中使用并不那么简单,而且它也更难阅读。顺便说一句,我认为这是一个错字,但你从
Items中提取的应该是order_id而不是id -
确定 order_id,谢谢..
-
@Fer:能不能举个左连接+分组+计数的例子!
标签: ruby-on-rails ruby activerecord