0

私は3つのモデルを持っています:

Agency
has_many :owners
has_many :properties

Owner
belongs_to :agency
has_many :properties

Property
belongs_to :owner
belongs_to :agency

リレーションは、agency.propertiesすべての所有者が持つすべてのプロパティを参照する必要がありますが、所有者内にプロパティを作成すると、agency.propertiesリレーションが作成されません。この関係が自動的に満たされ、所有者またはプロパティが削除されたときに削除されるようにします。

mongoid でこの動作を実現するにはどうすればよいですか?

4

2 に答える 2

1

次のように書くこともできます。

Agency
has_many :owners

Owner
belongs_to :agency
has_many :properties

Property
belongs_to :owner

次に、エージェンシー モデルにインスタンス メソッドを追加します。

def properties
 owners.map(&:properties).flatten.uniq
end

ただし、このアプローチではデータベースにクエリを実行して所有者を取得し、所有者ごとに 1 回 DB に再度クエリを実行して、各所有者のプロパティを取得します。

これが役立つことを願っています。

編集

2 つのクエリだけを意味する別のソリューションがあります。

def properties
 Property.where({:owner_id.in => owner_ids})
end

長所

2 つのクエリのみを使用します。

これは Mongoid Criteria を返します (前のソリューションは配列を返しました)。したがって、スコープなどを連鎖させることができます (つまり、my_agency.properties.sold #販売済みスコープを定義した場合)

短所

このコードは読みにくいようです。

さらに、保守性が低くなります。Owner-Property 関係で外部キーを変更する場合は、このメソッド (Property.where({:foreign_key...}) を更新するか、所有者が多くのプロパティを持つ方法を変更する必要があります。最初のオプションは、各所有者のプロパティは、インスタンス メソッド some_owner.properties で見つけることができます。

于 2013-09-27T14:23:02.340 に答える