fon*_*ong 3 ruby oracle activerecord
当表名需要模式名称作为前缀(oracle)时,有没有人在 ActiveRecord 中的映射表上遇到过这个问题?
宝石文件
gem 'activerecord', '4.2.4'
gem 'activerecord-oracle_enhanced-adapter', '1.6.7'
....
Run Code Online (Sandbox Code Playgroud)db_helper.rb
class Student < ActiveRecord::Base
self.abstract_class = true
self.table_name_prefix = 'OPT_ABC.'
self.table_name = 'STUDENT'
def self.list_student
puts Student.take(1) #testing
end
end
Run Code Online (Sandbox Code Playgroud)实际的表名称如下所示:
SELECT * FROM OPT_ABC.STUDENT;
Run Code Online (Sandbox Code Playgroud)我能够连接到数据库实例,但是当代码行时:
puts Student.take(1) # SELECT * FROM STUDENT LIMIT 1
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ActiveRecord::StatementInvalid:
table or view does not exist: SELECT "STUDENT".* FROM "STUDENT"
Run Code Online (Sandbox Code Playgroud)我正在寻找有关如何处理“OPT_ABC”表前缀的解决方案。请分享您的解决方案。
看起来问题在于,当您应该使用其中之一或另一个时,您却试图同时self.table_name_prefix=使用两者。self.table_name=
首先让我们考虑一下 和 是如何self.table_name_prefix=工作self.table_name=的。
根据文档,self.table_name_prefix=其工作原理是将传入的值添加到 ActiveRecord 根据类名称自动生成的表名称中。
因此,如果类名称是Student并且您这样做了self.table_name_prefix = 'OPT_ABC.',那么您的表名称将为OPT_ABC.STUDENTS。请注意,生成的表名称是复数(并以 结尾s)。
根据文档,self.table_name=显式设置表名称。这意味着它将完全覆盖您传入的值的表名称。
因此,如果您这样做,self.table_name = 'OPT_ABC.STUDENT'您的表名称将为OPT_ABC.STUDENT.
因此,考虑到要将表名称设置为OPT_ABC.STUDENT,您应该能够简单地将值传递到self.table_name如下所示:
class Student < ActiveRecord::Base
self.abstract_class = true
self.table_name = 'OPT_ABC.STUDENT'
def self.list_student
puts Student.take(1) #testing
end
end
Run Code Online (Sandbox Code Playgroud)