Rails和Mongo的范围

时间:2015-07-20 09:25:13

标签: ruby-on-rails mongoid

我有3个依赖模型 Mongoid

 class Account
   has_many :apps
 end

 class App
   belongs_to :account
   has_many :devices
 end

 class Device
   belongs_to :app
 end

我想获取所有属于帐户的设备元素,但设备帐户之间的关系是通过模型应用

ActiveRecord 环境中,它会是这样的:

scope :for_account, ->(account) { joins(:app).where("app.account = ?", account) }

如何使用Mongoid执行此操作?

1 个答案:

答案 0 :(得分:1)

我可以想到两种方法来解决这个问题。

Mongoid关系为我们提供了一套非常丰富的方法来帮助我们访问对象。

例如:

app.account       #returns account object
app.account_id    #returns bson id of account object
account.apps      #returns collection of apps
account.app_ids   #returns array of app bson ids

我们可以使用此功能,因此查找应用ID的所有设备都包含在帐户的应用ID列表中。类似的东西:

Device.where(app_id: { '$in' => account.app_ids})

这将返回一个很好的集合,就像任何其他mongo查询一样,但是具有搜索整个Device集合的缺点。根据您的数据库大小,这可能会让您感到不舒服。

可替换地:

account.apps.collect{ |a| a.devices}.flatten

将提供从帐户中的所有应用收集的设备项的数组

这样做的好处是搜索效率更高,而且阵列很可能适用于您需要此集合的任何内容。

希望这有帮助!