首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从文档数组创建关联代理

从文档数组创建关联代理
EN

Stack Overflow用户
提问于 2012-09-26 22:00:50
回答 1查看 513关注 0票数 0

我的一个项目的模型设置如下(使用Rails 3.2和Mongoid 3.0):

代码语言:javascript
复制
class Parent
  include Mongoid::Document

  has_many :kids

  def schools
    return kids.map { |kid| kid.school }
  end
end

class School
  include Mongoid::Document

  has_many :kids
end

class Kid
  include Mongoid::Document

  belongs_to :parent
  belongs_to :school
end

我的父模型充当我用Devise设置的标准用户模型。我想要一个具有indexshow方法的SchoolController,它只允许访问家长有孩子的学校。根据这个网站:http://www.therailsway.com/2007/3/26/association-proxies-are-your-friend/,最好的方法是这样做:

代码语言:javascript
复制
def index
  @schools = current_user.schools
end

def show
  @school = current_user.schools.find(params[:id])
end

然而,因为Mongoid不允许has_many :through关系,所以Parent#schools是一个自定义方法,它返回一个数组,而不是一个关联代理,因此#find不是一个可以使用的方法。有没有办法从一组文档中创建一个关联代理?或者,有没有更聪明的方法来处理这个简单的访问控制问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-27 03:40:28

我给返回的数组一个#find方法:

代码语言:javascript
复制
class Parent
  include Mongoid::Document

  has_many :kids

  def schools
    schools = self.kids.map { |kid| kid.school }

    # Returns a school with the given id. If the school is not found, 
    # raises Mongoid::Errors::DocumentNotFound which mimics Criteria#find.
    def schools.find(id)
      self.each do |school|
        return school if school.id.to_s == id.to_s
      end
      raise Mongoid::Errors::DocumentNotFound.new(School, {:_id => id})
    end

    return schools
  end
end

这样我就可以让我的控制器逻辑保持简单和一致:

代码语言:javascript
复制
class ParentsController < ApplicationController

  def show
   @school = current_user.schools.find(params[:id])
  end

end

不确定在这一点上是否有更好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12603493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档