你也可以这样写:
Agency
has_many :owners
Owner
belongs_to :agency
has_many :properties
Property
belongs_to :owner
然后在您的代理模型中添加一个实例方法:
def properties
owners.map(&:properties).flatten.uniq
end
但是,这种方法将查询您的数据库以检索所有者,然后将为每个所有者再次查询您的数据库以检索每个所有者的属性。
希望这会有所帮助。
编辑
还有另一种解决方案,它只包含 2 个查询:
def properties
Property.where({:owner_id.in => owner_ids})
end
优点:
它只使用两个查询。
它返回一个 Mongoid Criteria(之前的解决方案返回一个数组)。因此,您可以链接范围等(即 my_agency.properties.sold #如果您已定义销售范围)
缺点:
这段代码似乎不太可读。
此外,它的可维护性较差。如果您更改 Owner-Property 关系中的外键,则应更新此方法 (Property.where({:foreign_key...}) 或更改所有者拥有许多属性的方式。只要第一个选项仍然有效每个所有者属性都可以通过实例方法 some_owner.properties 找到。