2017-08-10 158 views
1

這裏是我在我的Rails應用程序創建的模型:紅寶石多加入

class Pet < ActiveRecord::Base 
    belongs_to :shelter 
    belongs_to :type 
end 

class Shelter < ActiveRecord::Base 
    has_many :pets 
end 

class Type < ActiveRecord::Base 
    has_many :pets 
end 

我試圖發現,沒有任何外來寵物在其中,但在路上我堅持連接表避難所我可以在那裏檢索這些信息!這是我最近的嘗試,我相信我至少已經到了類型表。任何關於連接的幫助和解釋將非常感謝!

Shelter.joins(:pet => :type).where(:types => {exotic => false}) 

回答

0

我相信不可能僅僅使用JOINS來獲得想要的結果。相反,你需要找到哪些避難所有異國情調的寵物,然後否定這一點。實現這一

一種方式是通過一個子查詢:

Shelter.where(<<~SQL) 
    NOT EXISTS (
    SELECT 1 FROM pets 
    INNER JOIN types ON types.id = pets.type_id 
    WHERE shelters.id = pets.shelter_id 
     AND types.exotic IS TRUE 
) 
SQL 

當然,這涉及到很多明確的SQL,這是我不介意的,但其他人不喜歡它。

您也可以使用ActiveRecord查詢界面做類似的事情。

shelters_with_exotics = Shelter.joins(pets: :type).where(types: { exotic: true }) 
Shelter.where.not(id: shelters_with_exotics) 

注意:這兩個示例的查詢是不同的。如果它很重要,則需要對它們進行基準測試,以確定哪一個性能最好。

+1

這正是我想查詢的內容。注意到你必須否定 - 謝謝你這樣徹底的回答! – Layla