Отсутствует имя столбца во время запроса ActiveAdmin - PullRequest
0 голосов
/ 22 февраля 2012

Rails 3.1, Ruby 1.9.2, с использованием базы данных SQL Server 2008 через гем activerecord-sqlserver-adapter.Я работаю с устаревшей базой данных, так что это не было добровольным.

У меня странная проблема с ActiveAdmin.Я не использовал ActiveAdmin раньше, и добавил его после просмотра Railscast.Следуйте стандартным инструкциям по установке, и я могу войти в консоль администратора.

Когда я добавляю модель:

rails generate active_admin:resource Payment

Модель (во множественном числе) теперь видна наПанель инструментов ActiveAdmin.Однако, когда я нажимаю на ссылку, я получаю следующую ошибку:

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'

Теперь этот запрос возвращает ту же ошибку, если я запускаю его непосредственно в базе данных SQL Server - он не похож на неназванныйстолбец «1».

Начал копать, чтобы увидеть, в чем проблема.Очевидные места для поиска - переходы между activeadmin и activerecord, а затем activerecord и адаптером SQL Server.Вот трассировка стека для первого пересечения:

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'

Это похоже на items_in_collection?Зов существует?в коллекции, в которой были удалены фильтры заказов.На данный момент мы передаем ActiveRecord.Если мы посмотрим на переход от ActiveRecord к адаптеру SQL Server, то будет выглядеть, как будто оператор SELECT уже сформирован:

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'

Я совершенно сбит с толку относительно того, почему SQL будет сгенерирован способомчто это.Есть несколько возможных проблемных областей:

  1. Я работаю над устаревшей базой данных со странной схемой.Я должен установить имена таблиц и имена первичных ключей в моих моделях.Я не думаю в этом проблема, поскольку в исходящем запросе, похоже, используются соответствующие первичный ключ и имена таблиц.
  2. Проблемы с гемом activerecord-sqlserver-adapter.Тем не менее, я извлек исходный код, и он точно не похож на то, что есть что-то, что могло бы собрать этот запрос таким образом.

Кто-нибудь сталкивался с чем-то подобным этому?Может быть, мне просто нужно отладить свой путь через весь стек, чтобы увидеть, что происходит.Я подумал, что сначала стоит проверить здесь.

Редактировать: Теперь я уверен, что это ошибка в activerecord-sqlserver-adapter.Разместим разрешение здесь, когда оно у меня будет.

Edit2: может воспроизвести ошибку без ActiveAdmin вообще.Это связано с тем, как адаптер sql-сервера обрабатывает смещенные запросы.Вызов

MyModel.offset(1).exists?

приводит к той же ошибке.У меня есть некрасивое исправление для адаптера, которое проходит все модульные тесты, но я собираюсь попытаться найти более элегантное решение, прежде чем делать запрос на извлечение.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Я не уверен, что это именно тот ответ, но я исправил свой локальный код, и ваш запрос теперь работает для меня.

Во-первых, проблема github:

https://github.com/rails/rails/issues/1623

, а затем запрос на извлечение исправления Аркадийка:

https://github.com/arkadiyk/rails/commit/7e2ddddb303d17adc825ebb691097a93902fa539

Основная проблема - это finder_methods.rb, который имеет существующий код в строке 187 или 188:

relation = relation.except(:select).select("1").limit(1)

MSSQL barfs для безымянного столбца, который генерируется, поэтому следующий код исправляет это:

relation = relation.except(:select).select("1 as o").limit(1)

Надеюсь, это поможет.

0 голосов
/ 08 марта 2012

Кажется, есть две альтернативы для исправления: исправить это в rails или исправить в activerecord-sqlserver-adapter.

Ссылка, предоставленная Raels, вероятно, является правильным способом исправить это.запрос на извлечение не был принят в рельсы.Я обеспокоен использованием исправленной версии rails, так как это заставит меня либо придерживаться своей исправленной версии, либо продолжать исправлять по мере развития rails.

Альтернативой является исправление этой ошибки в activerecord-sqlserver-адаптер.Я отправил запрос на извлечение здесь:

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

Возможно, разработчик active-sqlserver-adapter предложит более элегантное исправление.Если он это сделает, я обновлю этот ответ.

...