0

我有三个模型:

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

但是,这种方法将查询您的数据库以检索所有者,然后将为每个所有者再次查询您的数据库以检索每个所有者的属性。

希望这会有所帮助。

编辑

还有另一种解决方案,它只包含 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 找到。

于 2013-09-27T14:23:02.340 回答
0

由于这是一个非常具体的用例,因此无法使用“开箱即用”的 mongoid 来“自动”执行此操作。我建议你有一些 before_save 钩子,这将保证你的关系状态。您还可以根据您的用例,属性可以是所有者和代理内部的非规范化(嵌入)对象。

于 2013-09-16T15:52:09.263 回答