2

私が作成した可能性のある関係の問題に気付きました。

私は写真モデルから始めました。管理者は写真をアップロードでき、それらはサイトに存在します。

その後のイテレーションで、コードベースにアルバムが追加され、写真のコレクションを独自のページに整理できるようになりました。

Album
  has_many :photos, inverse_of: :album
Photo
  belongs_to :album, inverse_of: :photo

上記で遊んだ後、写真は 1 つのアルバムにのみ属することができることに気付きました。それは大丈夫です。

ここで、新たな問題が発生します。自身のモデルでもあるスタッフのメンバーの写真を追加したいと思います。

Photo モデルには、特定のアップロード サービス (ファイルピッカー) を使用して処理するための特別なロジックもあります。

Staff
  field :name, type: String

スタッフが自分の写真を持てるようにするにはどうすればよいですか? 非正規化のために新しいモデル StaffPhoto を作成する必要がありますか? 写真を埋め込むか、スタッフに所属させることを考えていましたが、アルバムとスタッフ メンバーの両方に所属することが理にかなっているのかどうかはわかりません。現在私にとって最も理にかなっている唯一のことは、別のモデルを作成し、アップロード サービス ロジックをモジュールに抽象化し、それを両方に含めることです。しかし、私は間違っている可能性があります。重要な部分は、写真全体が単独で、またはアルバムの一部、または一部のスタッフ メンバー (複数の写真) として存在することです。

これをモデル化する方法について何か提案はありますか?

4

2 に答える 2

1

さまざまな所有者クラスに属するものがある場合、ポリモーフィックな関連付けは適切です。たとえば、映画やテレビ番組の写真があり、データベースで既にモデル化されている映画やテレビ番組がある場合、ポリモーフィックな関連付けを使用して、の「所有者」オブジェクトを参照します。写真。

通常、管理者、スタッフ、およびユーザーを別々のモデルでモデル化することは望ましくありません。これを行うためのよりクリーンな方法は、それらすべてをユーザーとしてモデル化し、役割と権限を別々にモデル化することです。たとえば、全員が管理者になる可能性があります。

この種のユーザーのモデル化を選択した場合、写真モデルで必要なのは所有者をモデル化するための user_id だけです。それが管理者かスタッフか、通常のユーザーかは気にしません。

管理者の写真がスタッフの写真とはまったく異なる場合など、写真の使用方法もモデル化したい場合 (管理者の写真は背景、スタッフの写真は顔写真など)、「写真の種類」も割り当てることができます。写真の属性。

あなたのシナリオでは、ポリモーフィックな関連付けが最善の解決策であるとは思いません。

Railscast on Roles/Authorization を確認してください。管理者/スタッフを 1 つのモデルでモデル化できます。

http://railscasts.com/episodes?search=authorization


埋め込みドキュメントについて:

埋め込みドキュメントを使用する際の考慮事項がいくつかあります。

  • 埋め込まれたドキュメントは親ドキュメントを拡張/強化しますか?
  • 16MB の MongoDB レコード サイズを超えないこと
  • すべての埋め込みドキュメントを検索する必要がある場合

写真の場合、写真のサイズが大きいため、写真自体ではなく、写真への参照を埋め込む必要があります。

あなたのアプリケーションの場合、ユーザーに対して何枚の写真がありますか? それらの数は、時間の経過とともにかなりの数に増える可能性がありますか? はいの場合、おそらくそれらを埋め込みたくないでしょう。

写真はユーザーの記録を補強しますか? 例えば、それはアバターの写真ですか?そうでない場合は、おそらく埋め込みたくないでしょう。

写真全体を検索する必要がありますか? おそらくそうではありません。他の種類の埋め込みドキュメントは、最上位から検索する必要がある場合があり、それらを埋め込むことはできません。

于 2013-04-15T00:41:00.363 に答える