【问题标题】:How to set PostgreSQL table names in Rails with schema information?如何在 Rails 中使用模式信息设置 PostgreSQL 表名?
【发布时间】:2010-09-19 20:40:46
【问题描述】:

我必须在旧版 Postgre 数据库中连接我的 rails 应用程序。它使用模式,因此在 SQL 中,通常使用类似

的东西
SELECT * FROM "Financial".budget

我想写一个预算模型,但我不知道在这种情况下如何设置表名。我尝试了以下方法:

  • set_table_name '预算'
  • set_table_name '"财务".budget'

没有工作。

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:
    ActiveRecord::Base.establish_connection(
        :schema_search_path => 'Financial,public'
    )
    

    如果您使用的是 Postgres,那么以上对于大多数情况来说可能已经“足够好”了。

    【讨论】:

      【解决方案2】:

      我在使用 Oracle 适配器时遇到了类似的问题。默认情况下,ActiveRecord 总是引用 SQL 中的表名,因此如果您指定

      set_table_name "Financial.budget"
      

      那么生成的SQL就会

      SELECT * FROM "Financial.budget"
      

      这是行不通的。

      要解决这个问题,您需要修改 PostgreSQL 适配器。将以下代码放入您的 environment.rb 或单独的初始化程序中:

      ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
        # abstract_adapter calls quote_column_name from quote_table_name, so prevent that
        def quote_table_name(name)
          name
        end
      end
      

      现在你应该在你的模型类中定义

      set_table_name "Financial.budget"
      

      生成的 SQL 将是

      SELECT * FROM Financial.budget
      

      【讨论】:

        【解决方案3】:

        现在,这个错误似乎在 2-3-stable 中得到解决。看看this post

        【讨论】:

          【解决方案4】:

          查看您的日志——Rails 使用您的各种选项生成什么 SQL?

          【讨论】:

            【解决方案5】:
            set_table_name "Financial.budget"
            

            【讨论】:

              【解决方案6】:

              也许使用您的架构扩展搜索路径会对您有所帮助?

              SET SEARCH_PATH TO "Financial", public;
              

              然后您可以在没有架构的情况下编写不合格的查询:

              SELECT * FROM budget;
              

              【讨论】:

                【解决方案7】:

                我们设计了一个 gem 来让 ActiveRecord 与 PostgreSQL 一起工作。这是一个小的用法示例: http://greyblake.com/blog/2012/09/06/pg-power-activerecord-extension-for-postgresql/

                【讨论】:

                  猜你喜欢
                  • 2012-04-30
                  • 1970-01-01
                  • 2011-05-19
                  • 1970-01-01
                  • 2012-02-07
                  • 2020-03-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-03
                  相关资源
                  最近更新 更多