1

設置:的Rails:查詢連接表的孩子的存在

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 

是卓有成效的,但並不性感:單個查詢優選的。

+1

你想左反連接,即找到所有銷售的項目,做一個左聯接查找該用戶返回的項,並在where子句中只保留右側爲空的行。另一種選擇是在子查詢中使用NOT EXISTS。我不會說Rails/ActiveRecord,所以我不能將它從SQL翻譯成Rails,但希望這能讓你走上正軌。 –

+0

@CraigRinger謝謝,我正在尋找沒有被用戶返回的項目,而不是未返回的銷售(請參閱我的編輯) – gr8scott06

回答

0

出售:

def self.not_returned 
    where.not(Return.where("returns.sale_id = sales.id").exists) 
end 

然後,您可以:

Sale.not_returned 
+0

也許我的問題措辭不妙。我想要一個給定的用戶沒有返回的所有項目。 (項目可能有許多銷售範圍的用戶:如果一個項目有兩個銷售,一個返回,一個不是,我不想顯示該項目。) – gr8scott06

+0

因此,給定一個用戶實例,顯示該用戶購買的所有項目爲什麼用戶從未在用戶的任何銷售中返回該項目? –

+0

這是正確的。 – gr8scott06