将从mongoid查询构建的Ruby数组转换为实际的mongoid对象,还是重写方法返回mongoid对象?

时间:2017-07-17 06:52:28

标签: ruby mongoid

我有一个名为Department的mongoid模型和一个名为User的单独模型,两个模型之间没有本机关系。由于我的应用程序中的关系如何工作,我手动将文档ID存储在用户模型上。

我正在使用Ruby的Grape框架,它有一个位于名为Entities的Mongoid对象之上的过滤系统,它拒绝任何不是mongoid查询响应对象的东西,因为这个方法返回一个ruby数组而不是一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你不能像这样使用find吗?

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

我对mongoid不是很熟悉,但documentation似乎表明这正是如何实现你想要的。

  

标准#找到   通过ID查找文档或多个文档。如果任何ID不匹配,默认情况下会引发错误。

<强>示例:

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