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}
這不起作用,因爲它查詢所有items的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謝謝,我正在尋找沒有被用戶返回的項目,而不是未返回的銷售(請參閱我的編輯) – gr8scott06