質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

858閲覧

別ソリューションで、モデルを共有する方法

hiepita1

総合スコア37

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/06/11 07:50

お世話になっております。
複数のソリューションで、モデルを共有する方法を模索しています。
要件としては以下のとおりです。

ソリューションは全部で4つです。 - システム1ソリューション - システム2ソリューション - システム3ソリューション - commonシステムソリューション 同一DB内で、schemaでデータを管理します - System1Schema - system1table - System2Schema - system2table - System3Schema - system3table - CommonSchema - commontable

commonテーブルにはユーザーのマスター情報など、全システムで共有されるテーブルが格納されています。
各システムcommonシステム両者から編集追加等ができるのですが、使用するModelcommonソリューション
にのみ配置したいです。(validationの項目などが多いため、両者に配置するとメンテナンスの面で問題があるため)
この際に、System1からcommonシステムソリューションのモデルを利用してcommontableにアクセスするには
どのようにすればいいでしょうか?
(Schema_search_pathなどで挑戦しましたが、どうしても両者のソリューションにモデルを配置することになってしまいます。)
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

postgres上のテーブルの配置で解決しそうな気がします。

postgresはログインユーザーのスキーマになければpublicスキーマを参照するので、
「commonシステムソリューション」のテーブルをpublicスキーマーに配置しておく。

rails側でのモデルの共有の話であれば詳しくはないのですが、以下などが参考になるでしょうか?
複数Railsアプリケーションから同一DB(テーブル)を参照する場合にRails Engineを活用してmodelのソースを共有する

投稿2018/06/11 08:19

編集2018/06/11 08:28
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiepita1

2018/06/14 05:48

- saziさんの仰っているように、DB側で、schema_serch_pathを設定して判断することも考えたのですが、もしも不慮の自体が起きて両方のスキーマに共通のテーブルが出来た場合に、意図しない動作をすることや、テーブルがあるかどうかを検索することで速度の低下につながるのではないか?と考えてやめにしました。 - modelをgem化することにしました。ありがとうございました。
sazi

2018/06/14 06:04 編集

2重に登録されるというのをどのようなケースで想定されているのが分かりません。 model経由で行われるなら、どのような共有のモデルであったとしても同じでしょうし。 「どのスキーマに存在するかを検索する」の部分がpostgres内部の話をされているのなら、別スキーマに同じ名称のテーブルが有るなしにかかわらず毎回検索しますので、気にする必要があるような数値の差ではありません。逆にmodel側でどこに登録されているかを問合せての判断をされようとしているなら、postgresが行うより時間はかかると思います。
hiepita1

2018/06/15 01:00

言葉足らずで申し訳ありません。 - mainのソリューションのschema_serch_pathはmainのschemaのみ - commonのソリューションのschema_serch_pathはcommonのschemaのみ としたいのです。 - 速度低下に関しては、schema_serch_pathを1つから2つにした場合、毎回public側の検索が走って(postgres内部の話です)、mainのテーブルのみを利用した画面を表示する際に、速度が低下するのではないかと考えたためです。 - 両方のスキーマに同一のテーブルが2重に登録されるというのは、確かに通常は考えられないと思うのですが、Model経由だけでなく、コンバートツール等でデータが入るパターンもあり、一概にないとは言い切れないため、schema_serch_pathで両者のスキーマから検索する方法は、問題発生時に気付きづらいためやめました。 - 最終的には、model部分をgem化して、各modelに対して接続先のschemaを明示的に記述することにしました。
sazi

2018/06/15 01:17

publicを利用しない限り、mainのスキーマから、commonのschemaにアクセスする際には、スキーマ修飾を付加する必要があることは織り込み済みですか? mainのスキーマ名が変更になる可能性があるなら考慮が必要です。
hiepita1

2018/06/15 05:19

- 織り込み済みです。 共有するmodelファイル側で、 self.table_name='common.table_name' とすることで、共有modelからの接続はすべてcommonのschemaに行くようにしています。(生SQLをかいている部分はスキーマ修飾が必要ですが・・・) - 明示的にスキーマ名をつけたいという希望が少なからずあるので、publicは使用しない方向で行こうと思います。 - 色々と教えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問