[英]Rails Postgresql multiple schemas and the same table name
我有两个不同模式的表,例如cases
和events
。
在每个模式中,我有基本表
events.basic
cases.basic
这个表有关系:
events.basic
有一个cases.basic
( cases.basic
有很多events.basic
) 我的尝试失败了:
文件cases_basic.rb
class CasesBasic < ActiveRecord::Base
set_table_name 'cases.basic'
set_primary_key 'case_id'
has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id'
end
file events_basic.rb
class EventsBasic < ActiveRecord::Base
set_table_name 'events.basic'
set_primary_key 'event_id'
belongs_to :Case, :class_name => 'CasesBasic', :foreign_key => 'case_id'
end
环境:Ruby 1.9.3
,Rails 3.1.3
, gem 'pg'
我需要回答这个问题:
rake db:schema:dump
处理这种情况 编辑:
更改belongs_to
和has_many
(如Catcall建议)后我有同样的错误
PGError: ERROR: column basic.case_id does not exist
LINE 1: ...IN "cases"."basic" ON "cases"."basic"."case_id" = "events"."...
^
: SELECT "events"."basic".* FROM "events"."basic" INNER JOIN "cases"."basic" ON "cases"."basic"."case_id" = "events"."basic"."case_id" LIMIT 3
Rails生成错误的SQL。 我应该使用一些别名:
SELECT t1。* FROM“events”。“basic”t1 INNER JOIN“cases”。“basic”t2 ON t1。“case_id”= t2。“case_id”LIMIT 3
编辑2:确定这是我的f ***错误,我没有在我的示例数据库中添加events.basic.case_id列和外键。 有用!
问题1和2正在运行,但我们对rake db:schema:dump
什么疑问? Rails仅为公共模式生成模型。
我有很多表和关系,我想生成它们。
我建议使用pg_power gem 。 它提供了在迁移中创建PostgreSQL模式的语法,如下所示:
def change
drop_schema 'demography'
create_schema 'politics'
end
并且还要正确地将模式转储到schema.rb文件中。
查看http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/
这描述了如何配置Rails应用程序以使用具有多个模式的Postgres数据库。 他将表查找比作Unix路径的功能,从特定位置开始,然后回退到一般位置。
集成架构路径后,您可以成功查询这些表。 db:schema:dump将使用应用程序喜欢的相同模式优先级读取表。
[编辑:经过进一步阅读,我认为ActiveRecord根本不支持多种模式。 但我可能是错的。 我暂时将这个答案留在这里,虽然几乎肯定是错的。 ( 从概念上讲是正确的。但构建ActiveRecord的人可能没有与任何数据库人员交谈,因为数据库人员可能知道什么?)看起来IBM在2008年正在研究这个问题,但我不知道那是怎么回事工作结束。]
PostgreSQL在为不同模式中具有相同名称的表设置外键引用时没有任何问题。 像这样的代码
class CasesBasic < ActiveRecord::Base
set_table_name 'cases.basic'
set_primary_key 'case_id'
has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id'
end
可能需要是模式限定的。
现在,表case.basic“有很多”事件并不是真的,是吗? 不,它“有很多”事件。基本。 在整个两个班级中进行这种改变,让我们知道它是如何工作的。 (这里没有Rails,或者我会为你测试它。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.