我需要将我的Rails应用连接到一个旧版的PostgreSQL数据库。该数据库使用模式,因此在SQL中通常会使用类似以下的语句:
SELECT * FROM "Financial".budget
我想编写一个预算模型,但不知道如何设置表名。我尝试了以下方法:
- set_table_name 'budget'
- set_table_name '"Financial".budget'
但都没有成功。
我需要将我的Rails应用连接到一个旧版的PostgreSQL数据库。该数据库使用模式,因此在SQL中通常会使用类似以下的语句:
SELECT * FROM "Financial".budget
我想编写一个预算模型,但不知道如何设置表名。我尝试了以下方法:
但都没有成功。
ActiveRecord::Base.establish_connection(
:schema_search_path => 'Financial,public'
)
我曾遇到过与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
SET SEARCH_PATH TO "Financial", public;
然后,您可以在不使用模式的情况下编写未经限定的查询:
SELECT * FROM budget;
查看您的日志 - Rails 使用哪些选项生成了什么 SQL?
set_table_name "Financial.budget"