Skip to content

Instantly share code, notes, and snippets.

@HusseinMorsy
Created November 3, 2011 13:47
Show Gist options
  • Save HusseinMorsy/1336524 to your computer and use it in GitHub Desktop.
Save HusseinMorsy/1336524 to your computer and use it in GitHub Desktop.
komplexe Suchabfragen
Folgendes Beispiel:
Für den Airbus A380 gibt es besondere Anforderungen an den Flughafen, damit dieser Flugzeugtyp dort laden darfen.
Attribut a380_allowed.
Wir hätten alle Länder gelistet, die Flughäfen haben, auf denen der Airbus A380 landen darf.
Das Problem besteht darin, dass das a380_allowed kein Attribut des Country-Model ist, denn
sonst hätten wir folgende Abfrage durchführen können:
Country.where(a380_allowed: true)
=> SQLException: no such column: countries.a380_allowed
Da dass \gpmono{a380_allowed} jedoch ein Attribut der Tabelle airports ist könnten wir folgende
Country.airports.where(a380_allowed: true)
=> undefined method `airports'
Das funktioniert jedoch auch nicht, airports nur auf einem Objekt der country klasse angewendet werden kann.
Die Lösund ist die join-Methode, die für die Vernküpfung der der beiden Tabellen zuständig ist.
Country.joins(:airports).where("airports.a380_allowed = ? ", true)
Rails nimmt uns einiges an Arbeit ab. In SQL hätten wir schreiben müssen
SELECT "countries".* FROM "countries" INNER JOIN "airports" ON "airports"."country_id" = "countries"."id" WHERE "airports"."a380_allowed" = 't'
# Alternative
Country.joins(:airports).where("airports.a380_allowed" => true)
Es geht sogar noch komplexer.
Wir hätten gerne alle Länder in den die Pilotin "Tanja" gelandet ist.
Flight hat dazu ein Attribut pilot
Country.joins(:airports=>:flights).where("flights.pilot" => "Tanja")
Länder in den der Passagier Hussein gelandet ist:
Naheliegend wäre:
Country.joins(:airports=>:flights=>:passangers).where("passangers.name" => "Hussein")
=>Syntax-error
Aber syntatksch korrekt ist:
Country.joins(:airports=>{:flights=>:passangers}).where("passangers.name" => "Hussein")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment