【发布时间】:2010-09-19 20:40:46
【问题描述】:
我必须在旧版 Postgre 数据库中连接我的 rails 应用程序。它使用模式,因此在 SQL 中,通常使用类似
的东西SELECT * FROM "Financial".budget
我想写一个预算模型,但我不知道在这种情况下如何设置表名。我尝试了以下方法:
- set_table_name '预算'
- set_table_name '"财务".budget'
没有工作。
【问题讨论】:
我必须在旧版 Postgre 数据库中连接我的 rails 应用程序。它使用模式,因此在 SQL 中,通常使用类似
的东西SELECT * FROM "Financial".budget
我想写一个预算模型,但我不知道在这种情况下如何设置表名。我尝试了以下方法:
没有工作。
【问题讨论】:
ActiveRecord::Base.establish_connection(
:schema_search_path => 'Financial,public'
)
如果您使用的是 Postgres,那么以上对于大多数情况来说可能已经“足够好”了。
【讨论】:
我在使用 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
【讨论】:
现在,这个错误似乎在 2-3-stable 中得到解决。看看this post
【讨论】:
查看您的日志——Rails 使用您的各种选项生成什么 SQL?
【讨论】:
set_table_name "Financial.budget"
【讨论】:
也许使用您的架构扩展搜索路径会对您有所帮助?
SET SEARCH_PATH TO "Financial", public;
然后您可以在没有架构的情况下编写不合格的查询:
SELECT * FROM budget;
【讨论】:
我们设计了一个 gem 来让 ActiveRecord 与 PostgreSQL 一起工作。这是一个小的用法示例: http://greyblake.com/blog/2012/09/06/pg-power-activerecord-extension-for-postgresql/
【讨论】: