gpt4 book ai didi

ruby - ActiveRecord 映射到以架构名称为前缀的表名称

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:12 24 4
gpt4 key购买 nike

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

  1. gem 文件

    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"

我正在寻找有关如何处理“OPT_ABC.”表前缀的解决方案。请分享您的解决方案。

最佳答案

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

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


self.table_name_prefix=

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

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

self.table_name=

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

关于ruby - ActiveRecord 映射到以架构名称为前缀的表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40011450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com