如何在Rails中使用模式信息设置PostgreSQL表名?

3

我需要将我的Rails应用连接到一个旧版的PostgreSQL数据库。该数据库使用模式,因此在SQL中通常会使用类似以下的语句:

SELECT * FROM "Financial".budget

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

  • set_table_name 'budget'
  • set_table_name '"Financial".budget'

但都没有成功。

7个回答

4
ActiveRecord::Base.establish_connection(
    :schema_search_path => 'Financial,public'
)

如果您正在使用Postgres,以上内容对于大多数情况可能已经足够了。

3

我曾遇到过与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版本中得到解决。请查看这篇文章


0
也许通过将您的模式扩展到搜索路径中可以解决问题?
SET SEARCH_PATH TO "Financial", public;

然后,您可以在不使用模式的情况下编写未经限定的查询:

SELECT * FROM budget;

0

查看您的日志 - Rails 使用哪些选项生成了什么 SQL?


0
set_table_name "Financial.budget"

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接