2011-12-08 22 views
6

我有兩個不同模式的兩個表,例如 caseseventsRails Postgresql多模式和相同的表名

在每個模式我有表基本

  • 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 

環境: 紅寶石1.9.3,Rails的3.1.3gem 'pg'

我需要回答這個問題:

  1. 如何處理Rails的活動記錄這種情況呢?
  2. 如何查詢此表?
  3. 如何處理這種情況rake db:schema:dump

編輯:

改變belongs_tohas_many後(如噓聲建議)我有同樣的錯誤

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 

導軌產生壞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只爲公共模式生成模型。

我有很多表和關係,我想要生成它們。

+0

你的':Events'和':Case'可能應該是':events'和':case',但這可能不會解決它。 –

+0

@ muistooshort':Events'和':Case'看起來像別名,在這種情況下不會被帶到SQL中 –

+0

我對錶的外觀有些困惑,應該在「ON」情況下「。」基本「 「case_id」=「events」。「basic」。「case_id」'連接條件看起來像什麼?其中一個表沒有'case_id',這是一個問題,如果你手動完成,你會如何編寫這個連接條件? –

回答

1

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

介紹如何配置Rails應用程序使用Postgres數據庫有多個架構。他將查找表比作Unix路徑的功能,從特定的位置開始,然後回落到一般位置。

集成模式路徑後,可以成功查詢這些表。 db:schema:dump將使用應用程序首選的相同模式優先級讀取表。

+1

感謝您的回覆,但不幸的是這並不能解決問題,作者在這裏使用了'SET SEARCH_PATH TO schema1,schema2'方法,這對於簡單數據庫非常適用,當您不需要不同模式表間的關係時,它不能解決多個模式問題,你不能連接具有相同名稱的表。我的系統中有300個表,其中很多表具有相同的名稱。 –

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 

可能需要模式限定。

現在,表cases.basic「有很多」事件是不正確的,是嗎?不,它「有很多」events.basic。在兩個班級中進行這種改變,讓我們知道這是如何工作的。 (這裏沒有Rails,或者我會爲你測試。)

+0

「但是構建ActiveRecord的人可能沒有與任何數據庫人員交談,因爲數據庫人員可能知道什麼?」 DB人員知道參考完整性等愚蠢的東西(Rails認爲這是一個應用程序問題)。 Rails有很多好主意,ActiveRecord不是其中之一。 –

+0

@ muistooshort:和模式。 –

+0

而CHECK約束,函數索引,觸發器以及其他任何說MySQL3不理解的東西。 –

1

我會推薦使用pg_power gem。它提供了語法像這樣的遷移創建PostgreSQL的模式:

def change 
    drop_schema 'demography' 
    create_schema 'politics' 
end 

而且還需要大約正確傾銷架構到schema.rb文件護理。