将未维护的 ActiveRecord 适配器强制转换为 Rails 版本 6

Posted

技术标签:

【中文标题】将未维护的 ActiveRecord 适配器强制转换为 Rails 版本 6【英文标题】:forcing an unmaintained ActiveRecord adapter to Rails version 6 【发布时间】:2020-09-22 10:35:06 【问题描述】:

我正在开发“Advantage 数据库服务器”适配器扩展,以尝试与我有权访问的旧数据库(仍在使用中)对话。

我已经更新了“Advantage”Gem,以便它可以在新的/活动版本的 Ruby https://github.com/t12nslookup/advantage 上运行,并且已经看到我的 activerecord-advantage-adapter https://github.com/t12nslookup/activerecord_advantage_adapter 副本可以在 ruby​​ 1.9.3 和 rails 3.2 上运行.22

我一直在努力尝试强制它与 rails 6 一起工作,并且通过一个简单的“ruby”脚本取得了相当大的成功,该脚本“需要”宝石并访问数据,但我无法获得相同的简单数据库查询在 rails 控制台工作。

我在 WSL 2 中运行,如果它有什么不同的话(但我不相信。

ruby 2.7.0p0(2019-12-25 修订版 647ee6f091)[x86_64-linux],Rails 6.0.3.3

我在 activerecord-advantage-adapter github 项目中添加了一个 rails6 分支。

Ruby 脚本:

jadams@Temp046317:~/code/ais-lims$ more ../testme.rb
require 'rubygems'
gem 'advantage'
gem "activerecord-advantage-adapter"
require "active_record"

ActiveRecord::Base.establish_connection(
  adapter: 'advantage',
  options: 'ServerType=Local|Remote; ReadOnly=True; CommType=TCP_IP; Compression=INTERNET',
  database: '//172.27.176.1:6262/c$/ads/db/'
)

class Discount < ActiveRecord::Base
  self.table_name = 'DISCOUNT'
  self.sequence_name = :autogenerated
end

puts Discount.all.inspect
puts Discount.count

jadams@Temp046317:~/code/ais-lims$ ruby ../testme.rb
#<ActiveRecord::Relation [#<Discount >, #<Discount >, #<Discount >, #<Discount >]>
4

Rails 控制台:

jadams@Temp046317:~/code/ais-lims$ more config/database.yml
development:
  adapter: 'advantage'
  options: 'ServerType=Local|Remote; ReadOnly=True; CommType=TCP_IP; Compression=INTERNET'
  database: '//172.27.176.1:6262/c$/ads/db/'

jadams@Temp046317:~/code/ais-lims$ more app/models/discount.rb
class Discount < ApplicationRecord
  self.table_name = 'DISCOUNT'
  self.sequence_name = :autogenerated
end

jadams@Temp046317:~/code/ais-lims$ rails c
Running via Spring preloader in process 728
Loading development environment (Rails 6.0.3.3)
2.7.0 :001 > puts Discount.all.inspect
Traceback (most recent call last):
        1: from (irb):1
NoMethodError (undefined method `to_sym' for nil:NilClass)
2.7.0 :002 > puts Discount.count
Traceback (most recent call last):
        2: from (irb):1
        1: from (irb):2:in `rescue in irb_binding'
NoMethodError (undefined method `to_sym' for nil:NilClass)

任何有关如何调试或在哪里找到问题的提示,我将不胜感激。

乔恩

【问题讨论】:

Discount.all 是否给您错误?也许错误来自检查方法?如果您在脚本中评估控制台代码并得到错误,您可以添加调试器并开始搜索。祝你好运。 一个很好的起点是将您的呼叫包装在 begin/rescue 块中并打印完整的回溯。 ruby_object 离线联系我并建议:def self.testing_method byebug puts Discount.all.inspect end #console Class.testing_method 我要试试这个(我已经开始在 activerecord gem 中添加“byebug”到每一个有“to_sym”的点 这与“列”有关......我猜我需要更新该过程:Rails 3:“Discount.columns”:irb(main):002:0&gt; Discount.columns.map(&amp;:name) =&gt; ["CLIENT", "OFFICE", "STARTDATE", "ENDDATE", "TOTAL", "THRESHOLD", "PERCENT"] Rails 5:2.7.0 :001 &gt; Discount.columns.map(&amp;:name) Traceback (most recent call last): 1: from (irb):1 NoMethodError (undefined method to_sym ' 对于 nil:NilClass)` 哈哈! ...出于某种原因,虽然我正在执行“all_cols.uniq”,但代码被传递给下一个不是唯一的过程......所以有“rows x cols”列......现在它似乎正在工作(进行计数并获取数据......我稍后将不得不使用“joins”) 【参考方案1】:

@rmlockerd 和 @ruby_object 在帮助调试方面都是正确的,但归根结底,我只是以一种不起作用的方式编写了代码部分。

调试是关键

【讨论】:

以上是关于将未维护的 ActiveRecord 适配器强制转换为 Rails 版本 6的主要内容,如果未能解决你的问题,请参考以下文章

强制停止运行ActiveRecord,避免mysql max_execution_time

请安装 mysql 适配器 'gem install activerecord-mysql-adapter'

ActiveRecord #collection 方法不返回所有保存的集合[关闭]

uniapp px转rpx适配

Amazon FireTV Stick:强制 640x480 分辨率

每次强制安装