2017-08-10 4 views
1

Hier ist die Modelle ich in meiner Rails-Anwendung erstellt:Rubin mehrere verbindet

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 

Ich versuche Stände zu finden, die keine exotischen Tiere in ihnen haben, aber die Tabellen in der Art und Weise verbinden ist stecken Wo kann ich diese Informationen abrufen? Hier ist mein letzter Versuch, bei dem ich glaube, dass ich zumindest den Typen-Tisch erreiche. Jede Hilfe und Erklärung zu Joins wäre sehr willkommen!

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

Antwort

0

Ich glaube, es ist unmöglich, die gewünschten Ergebnisse nur mit JOINS zu erhalten. Stattdessen müssen Sie herausfinden, welche Unterkünfte exotische Haustiere haben und dann das negieren.

Eine Möglichkeit, das zu erreichen ist durch eine Unterabfrage:

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 

Natürlich, die eine Menge von expliziten SQL beinhaltet, etwas, das ich nicht dagegen, aber andere mögen es nicht.

Sie können auch etwas ähnliches nur mit der ActiveRecord-Abfrage-Schnittstelle tun.

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

HINWEIS: Die Abfragen für die beiden Beispiele sind unterschiedlich. Wenn es darauf ankommt, müssten Sie beide benchmarken, um festzustellen, welche die beste war.

+1

Dies ist genau das, was ich versuchte abzufragen. Bemerken Sie, dass Sie negieren müssen - danke für solch eine gründliche Antwort !! – Layla