2017-07-17 25 views
0

我有一个叫做Department的mongoid模型和一个名为User的独立模型,两个模型之间没有本地关系。由于我的应用程序中的关系如何工作,我手动将文档ID存储在用户模型上。将从mongoid查询构建的Ruby数组转换为实际的mongoid对象,或者重新写入方法以返回mongoid对象?

我使用Ruby的Grape框架,它有一个名为Entities Mongoid对象上面的一个过滤系统,并拒绝任何心不是一个mongoid查询响应对象,因为该方法返回一个红宝石阵列,而不是一个Mongoid对象,我的框架给了我错误。

有没有什么办法可以重写我的函数来返回一个Mongoid对象?或者有什么办法我可以将一个Mongoid对象数组转换成一个Mongoid对象?

## inside Department Model 
def self.user_can_access(user = nil) 
    if user != nil 
    departments = [] 
    ## department_access_keys are embedded documents belonging to a user 
    user.department_access_keys.each do |key| 
     departments << BACKBONE::Department.find(key.key) 
    end 
    departments ## => returns an array of Department Documents that a user has been granted access to 
    else 
    raise 'user was not defined' 
    end 
end 

回答

0

你就不能使用find这样?

departments = BACKBONE::Department.find(*user.department_access_keys.map(&:key)) 

我不是很熟悉mongoidDocumentation似乎表明,这是究竟是如何实现你想要什么。

Criteria#find 通过它们的ID查找文档或多个文档。如果有任何id不匹配,将默认提示错误。

例子:

Band.find("4baa56f1230048567300485c") 
Band.find(
    "4baa56f1230048567300485c", 
    "4baa56f1230048567300485d" 
) 
Band.where(name: "Photek").find(
    "4baa56f1230048567300485c" 
) 
+0

谢谢!我不知道为什么葡萄实体不接受数组,但这解决了我的问题! – aronlmin

2

我相信,“Mongoid对象”应该只是一个哈希,所以这应该工作(也注意到Enumerable.map代替phpish each { << }):

## inside Department Model 
def self.user_can_access(user = nil) 
    raise 'user was not defined' if user.nil? 

    { 
    departments: # return hash here 
     user.department_access_keys.map do |key| 
     BACKBONE::Department.find(key.key) 
     end 
    } 
end