新手问题 oracle_enhanced 错误,有见过类似的么?

pythinchina · 2015年06月13日 · 最后由 lgn21st 回复于 2015年06月26日 · 2056 次阅读

环境为 ruby2.0,ruby-oci8 2.1.8, activerecord-oracle_enhanced-adapter 1.5.6。

线下为代码: ———————————————————————————

require 'active_record'

ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced", :database => "//xxx:1521/orcl", :username => "office", :password => "office")

class User < ActiveRecord::Base

  self.table_name = "office_user"
end

user = User.first
#name字段为varchar2(20)类型
puts user.name

#做count没问题,不会报错
#puts User.count

线下为异常情况: —————————————————————————————————

D:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/active_record/att
ribute.rb:104:in `type_cast': undefined method `type_cast_from_database' for "VA
RCHAR2(20)":String (NoMethodError)
        from D:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/acti
ve_record/attribute.rb:42:in `original_value'
        from D:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/acti
ve_record/attribute.rb:37:in `value'
        from D:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/acti
ve_record/attribute_set.rb:31:in `fetch_value'
        from D:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/acti
ve_record/attribute_methods/read.rb:93:in `_read_attribute'
        from D:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/activerecord-4.2.1/lib/acti
ve_record/attribute_methods.rb:50:in `__temp__e616d656'
        from test_ac.rb:9:in `<main>’

Gemfile

# Oracle adapter
gem 'ruby-oci8', '~> 2.1.8'
gem 'activerecord-oracle_enhanced-adapter', git: 'https://github.com/rsim/oracle-enhanced.git', branch: 'rails42'
gem 'ruby-plsql'

#1 楼 @ericguo 谢谢您,这个方法解决了 Rails 中的问题,但是面对遗留系统,脱离 Rails 使用 Activeecord 时,如何解决?还望不吝赐教。

#1 楼 @ericguo 我也是用这个办法解决的。

#2 楼 @pythinchina 如果只读的话,可以这样声明模型:

class Binslimitsdetail < ActiveRecord::Base
  self.table_name = 'a_binslimitsdetails'
  self.primary_key = 'binslimitsdetailsid'
  establish_connection :mesods
  def readonly?
    true
  end
  belongs_to :binslimit, primary_key: 'binslimitsid', foreign_key: 'binslimitsid'
end

class Binslimit < ActiveRecord::Base
  self.table_name = 'a_binslimits'
  self.primary_key = 'binslimitsid'
  establish_connection :mesods
  def readonly?
    true
  end
  belongs_to :yieldlimit, class_name: 'Yieldlimit', primary_key: 'yieldlimitsid', foreign_key: 'yieldlimitsid'
  has_many :binslimitsdetails, primary_key: 'binslimitsid', foreign_key: 'binslimitsid'
end

#4 楼 @ericguo 我一直是脱离 Rails 在 Sinatra 下用的 ActiveRecord,同样的数据库结构,同样的代码,连接 mysql 或 sqlite 都没问题,就是用 oracle_enhanced 连接 Oracle 遗留库时出这种错,这应该是它的问题吧?您在二楼的回复,解决了在 Rails 中用时的问题,但是在 Sinatra 下用 ActiveRecord,还是出错,在自己的非 Rails 项目中如何绑定指定版本的 Oracle_enhanced?

#5 楼 @pythinchina 换 Rails,哈哈。。

#5 楼 @pythinchina Rails 移除不必要的 middleware 跟 Sinatra 添加 ActiveRecord,请问还有什么区别?

#6 楼 @ericguo 升级到最新的 oracle_enhanced 1.6 之后,故障排除,再次感谢您的帮助!

#7 楼 @lgn21st 升级到最新的 oracle_enhanced 1.6 之后,故障排除,我还是比较喜欢用 ActiveRecord+Sinatra,Rails 的配置慢慢学,以后轻量化用它,呵呵

#9 楼 @pythinchina 最近我也在某项目中开始用 oracle_enhanced,我感觉最繁琐的还是编译 ruby-oci8。Oracle 官方没有提供 Rails 的适配驱动,社区通过桥接 instantclient 的方式发展出这么一套方案,也的确不容易,所以有坑是必然的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号