Mongoid,如何保持公共父模型的关系同步?

时间:2013-09-15 20:44:31

标签: ruby-on-rails ruby-on-rails-3 mongoid ruby-on-rails-4 mongoid3

我有三种模式:

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实现此行为?

2 个答案:

答案 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挂钩,这将保证你的关系状态。根据您的使用案例,您还可以在所有者和代理商内部使用非规范化(嵌入式)对象。