当表名需要模式名称作为前缀(oracle)时,是否有人在ActiveRecord中的映射表上遇到此问题?
的Gemfile
gem 'activerecord', '4.2.4'
gem 'activerecord-oracle_enhanced-adapter', '1.6.7'
....
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
实际的表名如下:
SELECT * FROM OPT_ABC.STUDENT;
我能够连接到数据库实例,但是当代码到达行时:
puts Student.take(1) # SELECT * FROM STUDENT LIMIT 1
我收到以下错误:
ActiveRecord::StatementInvalid:
table or view does not exist: SELECT "STUDENT".* FROM "STUDENT"
我正在寻找有关如何处理'OPT_ABC。'表格前缀的解决方案。请分享您的解决方案。
答案 0 :(得分:3)
看起来问题是,当您应该使用一个或另一个时,您尝试同时使用self.table_name_prefix=
和self.table_name=
。
首先考虑一下self.table_name_prefix=
和self.table_name=
的工作原理。
根据documentation,self.table_name_prefix=
通过将传入的值预先添加到ActiveRecord根据类名自动生成的表名来工作。
因此,如果班级名称为Student
,而您self.table_name_prefix = 'OPT_ABC.'
,则您的班级名称将为OPT_ABC.STUDENTS
。请注意,生成的表名称是复数(并以s
结尾)。
根据documentation,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