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 будет сгенерирован способомчто это.Есть несколько возможных проблемных областей:
- Я работаю над устаревшей базой данных со странной схемой.Я должен установить имена таблиц и имена первичных ключей в моих моделях.Я не думаю в этом проблема, поскольку в исходящем запросе, похоже, используются соответствующие первичный ключ и имена таблиц.
- Проблемы с гемом
activerecord-sqlserver-adapter
.Тем не менее, я извлек исходный код, и он точно не похож на то, что есть что-то, что могло бы собрать этот запрос таким образом.
Кто-нибудь сталкивался с чем-то подобным этому?Может быть, мне просто нужно отладить свой путь через весь стек, чтобы увидеть, что происходит.Я подумал, что сначала стоит проверить здесь.
Редактировать: Теперь я уверен, что это ошибка в activerecord-sqlserver-adapter.Разместим разрешение здесь, когда оно у меня будет.
Edit2: может воспроизвести ошибку без ActiveAdmin вообще.Это связано с тем, как адаптер sql-сервера обрабатывает смещенные запросы.Вызов
MyModel.offset(1).exists?
приводит к той же ошибке.У меня есть некрасивое исправление для адаптера, которое проходит все модульные тесты, но я собираюсь попытаться найти более элегантное решение, прежде чем делать запрос на извлечение.