ActiveAdmin查询期间缺少列名称
-
29-10-2019 - |
题
使用SQL Server 2008数据库通过activerecord-sqlserver-adapter gem进行Rails 3.1,Ruby 1.9.2的安装。我正在使用旧版数据库,因此这不是自愿的。
我在使用ActiveAdmin时遇到了一个奇怪的问题。我以前没有使用过ActiveAdmin,而是在观看Railscast之后添加了它。按照标准安装说明进行操作,即可登录管理控制台。
当我添加模型时: 通用标签
该模型(复数形式)现在在ActiveAdmin仪表板上可见。但是,当我单击链接时,出现以下错误: 通用标签
现在,如果我直接在SQL Server数据库上运行此查询,则会返回相同的错误-它不喜欢未命名的“ 1”列。
开始挖掘以查看问题所在。显而易见的地方是在activeadmin和activerecord之间的转换,然后是activerecord和SQL Server适配器之间的转换。这是第一个交叉点的堆栈跟踪: 通用标签
看起来像items_in_collection吗?通话存在吗?在已删除订单过滤器的集合中。至此,我们将移交给ActiveRecord。如果我们看一下从ActiveRecord到SQL Server适配器的过渡,看起来好像已经形成了SELECT语句: 通用标签
我对为什么以这种方式生成SQL感到完全困惑。有几个候选问题区域:
- 我正在使用具有奇特模式的旧式数据库。我必须在模型中设置表名和主键名。我不认为这是问题,因为即将出现的查询似乎使用了适当的主键和表名。
-
activerecord-sqlserver-adapter
宝石问题。但是,我提取了源代码,并确定其中没有任何东西可以以这种方式组装此查询。有人遇到类似的事情吗?可能我只需要调试整个堆栈即可查看发生了什么。认为首先值得在这里进行检查。
编辑:我现在相当确定这是activerecord-sqlserver-adapter中的错误。我将在这里发布决议。
Edit2:完全没有ActiveAdmin即可重现该错误。这与sql server适配器处理偏移量查询的方式有关。打电话 通用标签
产生相同的错误。我的适配器有一个丑陋的补丁,可以通过所有的单元测试,但是在提出请求之前,我将尝试找到一个更优雅的解决方案。
解决方案
我不确定这是否是答案,但是我修补了本地代码,您的查询现在对我有用。
首先,github问题:
https://github.com/rails/rails/issues/1623
然后是对arkadiyk的修复请求:
https://github.com/arkadiyk/rails/commit/7e2ddddb303d17adc825ebb691097a93902fa539 / p>
基本问题是finder_methods.rb,它具有第187或188行附近的现有代码: 通用标签
由此生成的未命名列上的MSSQL barfs,因此以下代码对其进行了修复: 通用标签
希望有帮助。
其他提示
似乎有两个替代方法:将其固定在Rails中,或在ActiveRecord-SQLServer-适配器中修复它。
Raels提供的链接可能是解决此问题的正确方法,但是,拉出请求尚未被接受到Rails中。我担心使用修补版的rails,因为这将强迫我用我修补的版本坚持,或者继续修补Rails演变。
al替代方法是在ActiveRecord-SQLServer-适配器中修复此功能。我在这里提交了一个拉出请求:
https://github.com/rails-sqlserver/activerecord-SQLSERVER-ADAPTER / PULL / 171
有可能的维护者的维护者将提出更优雅的修复程序。如果他这样做,我会更新这个答案。