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

fon*_*ong 3 ruby oracle activerecord

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

  1. 宝石文件

    gem 'activerecord', '4.2.4'
    gem 'activerecord-oracle_enhanced-adapter', '1.6.7'
    ....
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 实际的表名称如下所示:

    SELECT * FROM OPT_ABC.STUDENT;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我能够连接到数据库实例,但是当代码行时:

    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”表前缀的解决方案。请分享您的解决方案。

Sco*_*ell 6

看起来问题在于,当您应该使用其中之一或另一个时,您却试图同时self.table_name_prefix=使用两者。self.table_name=

首先让我们考虑一下 和 是如何self.table_name_prefix=工作self.table_name=的。


self.表名前缀=

根据文档self.table_name_prefix=其工作原理是将传入的值添加到 ActiveRecord 根据类名称自动生成的表名称中。

因此,如果类名称是Student并且您这样做了self.table_name_prefix = 'OPT_ABC.',那么您的表名称将为OPT_ABC.STUDENTS。请注意,生成的表名称是复数(并以 结尾s)。

self.表名=

根据文档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)