我必须在传统的Postgre数据库中连接我的rails应用程序。它使用模式,从而在SQL它是常见的使用像如何在架构信息中设置Rails中的PostgreSQL表名?
SELECT * FROM "Financial".budget
我想写一个预算模型,但我不知道如何在这种情况下设置的表名。我已经试过如下:
- set_table_name '预算'
- set_table_name ' “财经” .budget'
都没有worket。
我必须在传统的Postgre数据库中连接我的rails应用程序。它使用模式,从而在SQL它是常见的使用像如何在架构信息中设置Rails中的PostgreSQL表名?
SELECT * FROM "Financial".budget
我想写一个预算模型,但我不知道如何在这种情况下设置的表名。我已经试过如下:
都没有worket。
现在,这个bug似乎在2-3稳定中得到解决。看看this post
看看你的日志 - Rails使用各种选项生成的SQL是什么?
set_table_name "Financial.budget"
也许扩展与您的架构的搜索路径会帮助你?
SET SEARCH_PATH TO "Financial", public;
然后,你可以写你的查询不合格而不架构:
SELECT * FROM budget;
我有类似的问题与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
ActiveRecord::Base.establish_connection(
:schema_search_path => 'Financial,public'
)
如果你使用的是Postgres,那么在大多数情况下,上述可能是“足够好”的。
我们设计了一个gem来使ActiveRecord与PostgreSQL一起工作。这里有一个小例子: http://greyblake.com/blog/2012/09/06/pg-power-activerecord-extension-for-postgresql/