2016-11-18 22 views
1

複数のデータベーステーブルに分割したいモデルがあります。すべてのデータと機能は同じですので、同じモジュール/ ecto.modelを使用したいのですが、保存されているテーブルが異なるだけです。さらに、私は実行時までテーブル名を知りません。エクトモデルのスキーマテーブル名を動的に設定する方法

誰でも動的に設定する方法を提案できますSCHEMAテーブル名?

+0

あなたの質問に対する答えはわかりませんが、同じテーブル名を使用して別のreposを使用することもできます。または、postgresを使用している場合は、アプリケーションに透過的にそのシャーディングを処理するcitusを見ることができます。 – Homan

+1

これを選択するには、 'p from {" posts2 "、Post}、p.id == 1'のようなテーブル名/スキーマのタプルを渡すことができます。挿入するには、 'Repo.insert_all(" posts2 "、[...])'にテーブル名を渡すことができますが、 'Repo.insert'でこれをどうするのか分かりません。 – Dogbert

+0

@Dogbertありがとう、あなたのコメントは私に今夜多くの時間を節約しました! –

答えて

3

スキーマを必要とするほとんどの関数は、{"source", Schema}の形式でタプルを受け取ります。ここで、sourceはテーブル名です。ソースも構造体によって適切に管理されているので、特定のソースから選択すると、更新/削除時に適切なテーブルに解決されます。既にビルド構造体に注釈を付けるためのEcto.put_meta(struct, source: "source")もあります。

これらの機能は最近、さらに多くのユースケースをカバーするように拡張されました。この問題の詳細は、#1797です。

+0

ありがとう! 'Ecto.put_meta(struct、source:" source ")'は、挿入/更新中に非常に役立つことが判明しました。 'Ecto.Repo.get_by/3'の助けを借りて同じテクニックを使用してデータを取得することは可能ですか? –

+0

私はそれを理解しました。 '{" source "、Schema}"を 'Ecto.Repo.get_by/3'の最初の引数として渡すことができます。あなたのすべての協力に感謝します。 –

関連する問題