簡體   English   中英

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

[英]Rails Postgresql multiple schemas and the same table name

我有兩個不同模式的表,例如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

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

我需要回答這個問題:

  1. 如何在Rails Active Record中處理這種情況?
  2. 如何查詢這個表?
  3. 如何在rake db:schema:dump處理這種情況

編輯:

更改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 ***錯誤,我沒有在我的示例數據庫中添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM