在我的在线商店中,如果订单处于“已授权”状态,并且没有任何相关发货,则该订单已准备好发货。现在我正在做这件事:
class Order < ActiveRecord::Base
has_many :shipments, :dependent => :destroy
def self.ready_to_ship
unshipped_orders = Array.new
Order.all(:conditions => 'state = "authorized"', :include => :shipments).each do |o|
unshipped_orders << o if o.shipments.empty?
end
unshipped_orders
end
end
有没有更好的方法?
发布于 2009-04-25 01:16:13
您还可以使用普通的查找语法查询关联:
Order.find(:all, :include => "shipments", :conditions => ["orders.state = ? AND shipments.id IS NULL", "authorized"])
发布于 2012-07-17 00:27:16
在Rails 3中使用AREL
Order.includes('shipments').where(['orders.state = ?', 'authorized']).where('shipments.id IS NULL')
发布于 2009-04-24 23:38:28
一种选择是订购一个shipment_count,它将根据您附加到它的货件数量自动更新。然后你就
Order.all(:conditions => [:state => "authorized", :shipment_count => 0])
或者,您也可以使用一些SQL:
Order.find_by_sql("SELECT * FROM
(SELECT orders.*, count(shipments) AS shipment_count FROM orders
LEFT JOIN shipments ON orders.id = shipments.order_id
WHERE orders.status = 'authorized' GROUP BY orders.id)
AS order WHERE shipment_count = 0")
在使用它之前对其进行测试,因为SQL不是我的拿手好戏,但我认为它几乎是正确的。我让它在我的生产DB (即MySQL )上对类似的对象排列起作用。
请注意,如果您在orders.status上没有索引,我强烈建议您这样做!
查询的作用:子查询获取所有处于授权状态的订单的所有订单计数。外部查询将该列表向下过滤为发货计数等于零的列表。
可能有另一种方法可以做到这一点,有点违反直觉:
"SELECT DISTINCT orders.* FROM orders
LEFT JOIN shipments ON orders.id = shipments.order_id
WHERE orders.status = 'authorized' AND shipments.id IS NULL"
抓取所有已授权且在发货表中没有条目的订单;)
https://stackoverflow.com/questions/788106
复制相似问题