我有三种模式:
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实现此行为?
答案 0 :(得分:1)
你也可以这样写:
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#如果已定义已售出的范围)
<强> CONS 强>:
此代码似乎不太可读。
此外,它的可维护性较差。如果更改Owner-Property关系中的外键,则应更新此方法(Property.where({:foreign_key ...})或更改所有者拥有多个属性的方式。第一个选项仍然有效,只要可以使用实例方法some_owner.properties找到每个所有者属性。
答案 1 :(得分:0)
由于这是一个非常具体的用例,因此无法使用mongoid'开箱即用'来“自动”执行此操作。我建议你有一些before_save挂钩,这将保证你的关系状态。根据您的使用案例,您还可以在所有者和代理商内部使用非规范化(嵌入式)对象。