次のように書くこともできます。
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 で見つけることができます。