Rails Postgresql有多个模式和相同的表名

时间:2011-12-08 07:58:50

标签: ruby-on-rails ruby postgresql activerecord schema

我有两个不同模式的表,例如 casesevents

在每个模式中,我都有表格基本

  • events.basic
  • cases.basic

这个表有关系:

  • events.basic有一个cases.basiccases.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

档案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.3gem 'pg'

我需要回答这个问题:

  1. 如何在Rails Active Record中处理这种情况?
  2. 如何查询此表?
  3. 如何在rake db:schema:dump
  4. 中处理这种情况

    编辑:

    更改belongs_tohas_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 *** bug,我没有在我的示例数据库中添加events.basic.case_id列和外键。 有效!


    问题1和问题2正在起作用,但我们对rake db:schema:dump有什么疑问? Rails仅为公共模式生成模型。

    我有很多表和关系,我想生成它们。

3 个答案:

答案 0 :(得分:1)

查看http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/

这描述了如何配置Rails应用程序以使用具有多个模式的Postgres数据库。他将表查找比作Unix路径的功能,从特定位置开始,然后回到一般位置。

集成架构路径后,您可以成功查询这些表。 db:schema:dump将使用您的应用程序喜欢的相同模式优先级读取表。

答案 1 :(得分:1)

[编辑:经过进一步阅读,我认为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,或者我会为你测试它。)

答案 2 :(得分:1)

我建议使用pg_power gem。它提供了在迁移中创建PostgreSQL模式的语法:

def change
  drop_schema 'demography'
  create_schema 'politics'
end

并且还要正确地将模式转储到schema.rb文件中。