Frage

Rails 3.1, Ruby 1.9.2, unter Verwendung einer SQL Server 2008-Datenbank über das Juwel activerecord-sqlserver-adapter. Ich arbeite mit einer Legacy-Datenbank, daher war dies nicht freiwillig.

Ich habe ein seltsames Problem mit ActiveAdmin. Ich habe ActiveAdmin noch nicht verwendet und es nach dem Ansehen eines Railscasts hinzugefügt. Befolgen Sie die Standardinstallationsanweisungen, und ich kann mich bei der Administratorkonsole anmelden.

Wenn ich ein Modell hinzufüge:

rails generate active_admin:resource Payment

Das Modell (im Plural) ist jetzt im ActiveAdmin-Dashboard sichtbar. Wenn ich jedoch auf den Link klicke, wird folgende Fehlermeldung angezeigt:

TinyTds::Error: No column name was specified for column 2 of '__rnt'.: EXEC 
sp_executesql N'SELECT TOP (1) [__rnt].* FROM ( SELECT ROW_NUMBER() OVER (ORDER
BY [Payments].[UPaymentID] ASC) AS [__rn], 1 FROM [Payments] ) AS [__rnt] 
WHERE [__rnt].[__rn] > (0) ORDER BY [__rnt].[__rn] ASC'

Diese Abfrage gibt nun denselben Fehler zurück, wenn ich sie direkt in der SQL Server-Datenbank ausführe. Die unbenannte Spalte "1" gefällt ihr nicht.

Begann zu graben, um zu sehen, was das Problem war. Die naheliegenden Orte wären die Übergänge zwischen activeadmin und activerecord und dann activerecord und dem SQL Server-Adapter. Hier ist die Stapelverfolgung für die erste Kreuzung:

activerecord (3.1.0) lib/active_record/relation/finder_methods.rb:197:in `exists?'  
activeadmin (0.4.2) lib/active_admin/views/pages/index.rb:41:in `items_in_collection?'  
activeadmin (0.4.2) lib/active_admin/views/pages/index.rb:20:in `main_content'

Es sieht aus wie items_in_collection? Gibt es einen Anruf? für eine Sammlung, bei der Bestellfilter entfernt wurden. Zu diesem Zeitpunkt übergeben wir an ActiveRecord. Wenn wir uns den Übergang von ActiveRecord zum SQL Server-Adapter ansehen, sieht es so aus, als ob die SELECT-Anweisung bereits gebildet wurde:

activerecord-sqlserver-adapter (3.1.6) lib/active_record/connection_adapters/sqlserver/database_statements.rb:348:in `do_exec_query'
activerecord-sqlserver-adapter (3.1.6) lib/active_record/connection_adapters/sqlserver/database_statements.rb:24:in `exec_query'
activerecord-sqlserver-adapter (3.1.6) lib/active_record/connection_adapters/sqlserver/database_statements.rb:297:in `select'
activerecord (3.1.0) lib/active_record/connection_adapters/abstract/database_statements.rb:18:in `select_all'
activerecord (3.1.0) lib/active_record/connection_adapters/abstract/query_cache.rb:61:in `block in select_all'

Ich bin völlig verwirrt darüber, warum SQL so generiert wird, wie es ist. Es gibt einige mögliche Problembereiche:

  1. Ich arbeite an einer Legacy-Datenbank mit einem ungeraden Schema. Ich muss Tabellennamen und Primärschlüsselnamen in meinen Modellen festlegen. Ich glaube nicht, dass dies das Problem ist, da die kommende Abfrage den entsprechenden Primärschlüssel und die entsprechenden Tabellennamen zu verwenden scheint.
  2. Probleme mit dem activerecord-sqlserver-adapter gem. Ich habe jedoch den Quellcode abgerufen, und es sieht sicher nicht so aus, als gäbe es irgendetwas, das diese Abfrage auf diese Weise zusammenstellen würde.

    Ist jemand auf etwas Ähnliches gestoßen? Es kann sein, dass ich mich nur durch den gesamten Stapel debuggen muss, um zu sehen, was los ist. Ich dachte, es lohnt sich, zuerst hier nachzuschauen.

    Bearbeiten: Ich bin mir jetzt ziemlich sicher, dass dies ein Fehler im activerecord-sqlserver-Adapter ist. Werde hier eine Auflösung veröffentlichen, sobald ich sie habe.

    Edit2: Kann den Fehler ohne ActiveAdmin reproduzieren. Dies hängt mit der Art und Weise zusammen, wie der SQL Server-Adapter mit Offset-Abfragen umgeht. Anrufen

    MyModel.offset(1).exists?
    

    erzeugt den gleichen Fehler. Ich habe einen hässlichen Patch auf dem Adapter, der alle Unit-Tests besteht, aber ich werde versuchen, eine elegantere Lösung zu finden, bevor ich eine Pull-Anfrage stelle.

Andere Tipps

Es scheint zwei Alternativen zu geben, um dies zu beheben: Fixieren Sie es in Schienen oder reparieren Sie es in activerecord-sqlserver-adapter.

Der von Raels bereitgestellte Link ist wahrscheinlich der richtige Weg, um dies zu beheben. Die Pull-Anforderung wurde jedoch nicht in Rails akzeptiert.Ich mache mir Sorgen über die Verwendung einer gepatchten Version von Schienen, da ich dadurch entweder an meiner gepatchten Version festhalten oder weiter patchen muss, wenn sich die Schienen weiterentwickeln.

Eine Alternative besteht darin, dies im activerecord-sqlserver-Adapter zu beheben.Ich habe hier eine Pull-Anfrage eingereicht:

https://github.com/rails-sqlserver/activerecord-sqlserver-adapter / pull / 171

Es ist möglich, dass der Betreuer des Active-SQL-Server-Adapters eine elegantere Lösung findet.Wenn ja, werde ich diese Antwort aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top