ActiveRecord映射到表名称,模式名称为前缀

时间:2016-10-13 02:45:37

标签: ruby oracle activerecord

当表名需要模式名称作为前缀(oracle)时,是否有人在ActiveRecord中的映射表上遇到此问题?

  1. 的Gemfile

    gem 'activerecord', '4.2.4'
    gem 'activerecord-oracle_enhanced-adapter', '1.6.7'
    ....
    
  2. 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
    
  3. 实际的表名如下:

    SELECT * FROM OPT_ABC.STUDENT;
    
  4. 我能够连接到数据库实例,但是当代码到达行时:

    puts Student.take(1) # SELECT * FROM STUDENT LIMIT 1
    

    我收到以下错误:

    ActiveRecord::StatementInvalid: 
    table or view does not exist: SELECT "STUDENT".* FROM "STUDENT"
    
  5. 我正在寻找有关如何处理'OPT_ABC。'表格前缀的解决方案。请分享您的解决方案。

1 个答案:

答案 0 :(得分:3)

看起来问题是,当您应该使用一个或另一个时,您尝试同时使用self.table_name_prefix=self.table_name=

首先考虑一下self.table_name_prefix=self.table_name=的工作原理。

self.table_name_prefix =

根据documentationself.table_name_prefix=通过将传入的值预先添加到ActiveRecord根据类名自动生成的表名来工作。

因此,如果班级名称为Student,而您self.table_name_prefix = 'OPT_ABC.',则您的班级名称将为OPT_ABC.STUDENTS。请注意,生成的表名称是复数(并以s结尾)。

self.table_name =

根据documentationself.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