【发布时间】:2015-09-07 01:14:51
【问题描述】:
设置:
class User < ActiveRecord::Base
has_many :sales
has_many :sold_items, through: :sales, source: item
has_many :returns, through: sold_items
end
class Sale < ActiveRecord::Base
belongs_to :user
belongs_to :item
has_one :return
end
class Item < ActiveRecord::Base
has_many :sales
has_many :returned_sales, through: :sales, source: :return
end
class Return < ActiveRecord::Base
belongs_to :sale
end
问题:
编辑:澄清问题。我希望给定用户不返回所有项目。
提示:项目可能有销售范围为用户:如果一个项目有两个销售,一个返回一个不返回,我不想显示该项目。
user_items = user.sold_items.distinct
goal = user_items.reject {|i| i.returned_sales.first}
这不起作用,因为它查询所有returned_sales 的商品,而不仅仅是用户范围内的商品。
编辑:添加返回关联has_one :returned_item, through: :sale, source: :item并查询
returned_items = user.returns.map {|r| r.item}
goal = user_items - returned_items
成功但不性感:首选单个查询。
【问题讨论】:
-
您想要一个左反连接,即查找所有已售商品,执行左连接以查找该用户返回的商品,并在 where 子句中仅保留右侧为空的行.另一种选择是将
NOT EXISTS与子查询一起使用。我不会说 Rails/ActiveRecord,所以我不能把它从 SQL 翻译成 Rails 语言,但希望这能让你走上正轨。 -
@CraigRinger 谢谢,我正在寻找用户未退回的商品,而不是未退回的销售(请查看我的编辑)
标签: sql ruby-on-rails postgresql activerecord rails-activerecord