Created
November 3, 2011 13:47
-
-
Save HusseinMorsy/1336524 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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