2011-12-08 20 views
6

2つの異なるスキーマに2つのテーブルがあります。 casesおよびevents。各スキーマでRails Postgresqlの複数のスキーマと同じテーブル名

私はテーブルを持っている。このテーブルは関係を持つ

  • events.basic
  • cases.basic

基本:

  • events.basicは1 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のActive Recordの中で、この状況をどのように扱いますか?
  2. このテーブルをクエリする方法は? (野次るのように示唆)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 
    

    Railsが悪い生成同じエラーを持っている

    rake db:schema:dump


EDITでこの状況に対処するためにどのよう

  • SQL。

    SELECT t1。* FROM "events" "basic" t1 INNER JOIN "cases"。 "basic" t2 ON t1。 "case_id" = t2。 "case_id" LIMIT 3


    EDIT 2:私のF ***バグ、私は私の例データベースにevents.basic.case_id列と外部キーを追加しませんでした [OK]をクリックします。 それは動作します!


    質問1と2は、作業しているが、我々はおよそrake db:schema:dump何それについて質問がありますか? Railsはパブリック・スキーマ専用のモデルを生成します。

    私はそれらを生成したいテーブルとリレーションをたくさん持っています。

  • +0

    あなたの ':Events'と':Case'はおそらく ':events'と':case'ですが、それはおそらくそれを修正しません。 –

    +0

    @muistooshort ':Events'と':Case'はエイリアスのように見え、この場合はSQLに変換されません –

    +0

    テーブルがどのように見えるのか少し混乱します。 "case_id" = "events"。 "basic"。 "case_id" 'join conditionはどのように見えますか?テーブルの1つに 'case_id'がなく、それが問題です。あなたが手動でそれを行っていた場合、その結合条件をどのように書きますか? –

    答えて

    1

    チェックアウトhttp://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/

    これは、複数のスキーマにPostgresデータベースを使用するためのRailsアプリケーションを設定する方法について説明します。彼は、テーブルルックアップを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 
    

    は、おそらくスキーマ修飾されている必要があります。

    今、テーブルのケースが基本的な「多くの」イベントがあることは間違いありません。いいえ、それは "たくさんの"イベントがあります。基本的です。あなたの2つのクラスを通してそのような変化を持ち、それがどのように働くかを教えてください。 (ここにはレールはありません。)

    +0

    "ActiveRecordを構築した人は、おそらくデータベースの人々と話すことはできませんでした。 DBの人々は、参照整合性のような愚かなことを知っています(Railsはアプリケーションの問題だと思います)。 Railsには良いアイデアがたくさんありますが、ActiveRecordはその1つではありません。 –

    +0

    @muistooshort:そしてスキーマ。 –

    +0

    CHECK制約、ファンクションインデックス、トリガなど、MySQL3が理解できなかったもの –

    1

    pg_power gemをお勧めします。

    def change 
        drop_schema 'demography' 
        create_schema 'politics' 
    end 
    

    をし、また正しくschema.rbファイルにスキーマをダンプ気をとります。それはこのような移行にPostgreSQLのスキーマを作成するための構文を提供します。

    関連する問題