Rails 3, WIE query löst Ausnahme aus, wenn mit einem doppelten Doppelpunkt und ein Punkt
In rails 3.0.0, die folgende Abfrage funktioniert einwandfrei:
Author.where("name LIKE :input",{:input => "#{params[:q]}%"}).includes(:books).order('created_at')
Allerdings, wenn ich die Eingabe als Suchbegriff ein (also mit einem doppelten Doppelpunkt, gefolgt von einem Punkt):
aa:.bb
Bekomme ich die folgende exception:
ActiveRecord::StatementInvalid: SQLite3::SQLException: Mehrdeutiger Spaltenname: created_at
In den logs die dies sind die sql-Abfragen:
with aa as input:
Author Load (0.4ms) SELECT "authors".* FROM "authors" WHERE (name LIKE 'aa%') ORDER BY created_at
Book Load (2.5ms) SELECT "books".* FROM "books" WHERE ("books".author_id IN (1,2,3)) ORDER BY id
with aa:.bb as input:
SELECT DISTINCT "authors".id FROM "authors" LEFT OUTER JOIN "books" ON "books"."author_id" = "authors"."id" WHERE (name LIKE 'aa:.bb%') ORDER BY created_at DESC LIMIT 12 OFFSET 0
SQLite3::SQLException: ambiguous column name: created_at
Es scheint, dass mit der aa:.bb-Eingang, eine zusätzliche Abfrage zum abrufen der eindeutigen Autor id_s.
Ich dachte, Schienen würde Flucht alle Zeichen. Ist dieses erwartete Verhalten oder ein bug?
Beste Grüße,
Pieter
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die "mehrdeutige Spalte" Fehler in der Regel passiert, wenn Sie verwenden, schließt oder verbindet und nicht angeben, welche Tabelle Sie sich beziehen:
Werden sollte:
Nur "name" ist mehrdeutig, wenn Sie Ihre Bücher, die Tabelle hat eine Spalte zu.
Außerdem: haben Sie einen Blick auf Ihre Entwicklung.anmelden, um zu sehen, was die generierte Abfrage aussieht. Dies wird Ihnen zeigen, wenn es ordnungsgemäß geschützt.
Ersetzen
mit
Diese zwingen sollte, activerecord mit 2 Abfragen statt der Verknüpfung.
Schienen hat 2 Versionen enthalten: Eine, die baut eine große Abfrage mit joins (das 2. von 2 Abfragen und somit eher in der Folge der zweideutigen Spalte Verweise und eine, die verhindert, dass die Verknüpfungen zu Gunsten einer separaten Abfrage pro Verein.
Schienen entscheidet, welche Strategie verwendet, basierend auf, ob Sie denkt, dass Ihre Bedingungen, Reihenfolge etc finden Sie in der mitgelieferten Tabellen (da in diesem Fall die joins-version erforderlich ist). Wo eine Bedingung ist eine string-fragment, die Heuristik ist nicht sehr anspruchsvoll - ich scheine zu erinnern, dass es nur scannt die Bedingungen für alles, was Aussehen könnte wie eine Spalte aus einer anderen Tabelle (also foo.bar), so dass ein literal der form kann täuschen.
Können Sie sich entweder qualifizieren die Spaltennamen so, dass es egal ist, welche umfasst Strategie verwendet wird, oder Sie können mit Vorspannung/eager_load statt enthält. Diese Verhalten sich ähnlich, gehören aber Kraft einer bestimmten umfassen Strategie, anstatt zu versuchen zu erraten, welche am besten geeignet ist.