【问题标题】:Fetch all records with associations in RoR 3获取 RoR 3 中具有关联的所有记录
【发布时间】:2013-02-14 15:26:36
【问题描述】:

我是 RoR 3 的新手,我遇到了问题。 我有这样的课程User

class User < ActiveRecord::Base
  attr_accessible :firstname, :lastname, :login, :password, :rank, :sa_id, 
  belongs_to :role
  belongs_to :company
end

当我在我的控制器中获得第一个用户(例如)User.first 我可以访问User.first.role

是否可以获取包括 belongs_to 对象在内的所有用户? 就像结果是所有用户,每个用户都有一个角色类型的对象和一个公司类型的对象?

谢谢

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我不确定这是否是您要查找的内容,但您可以预先加载关联,因此只有 1 个请求被发送到数据库(实际上是 3 个,一个用于用户,一个用于角色,一个用于公司)

    >> users = User.includes(:role, :company)
    >> users.each do |user|
         puts user.role
         puts user.company
       end
    

    更新:渲染 json,使用

    respond_with(@user) do |format|
      format.json { render json: @user.to_json(methods: [:company, :role] }
    end
    

    【讨论】:

    • 不太确定 .includes 是否必要。是吗?
    • 如果您想急切加载。如果不这样做,则每次访问user.roleuser.company 时都必须查询数据库
    • 谢谢,但这不会对返回的结果产生任何影响。我仍然只有我的用户。 User.includes(:role, :company) 仅返回用户列表,循环不会改变任何内容。
    • 看来我真的没有得到你的问题。如果您显示您期望的某种结果,这将有所帮助。
    • 我希望类似 [{ "user": { "company_id": 1, "login": "mylogin", "password": "mypassword", "role_id": 1, }, "公司”:{“id”:1,“名称”:“QuimeO”,},“角色”:{“id”:1,“名称”:“这是我的角色”,}},{“用户”: { "company_id": 1, "login": "mylogin", "password": "mypassword", "role_id": 1, }, "company": { "id": 1, "name": "QuimeO", }, "role": { "id": 1, "name": "这是我的角色", } }]
    【解决方案2】:

    如果你使用了脚手架,你的UsersController内部应该还有一个生成的index方法。

    在那里你应该看到这样的东西:

    @users = User.all
    

    这会从数据库中获取所有用户对象。

    现在您可以像以前一样遍历这些用户并访问 role 字段。

    但是:这使用延迟加载。意味着:对于每个访问的role,它将执行一个单独的查询。要解决此问题,请使用“急切加载”(http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations):

    @users = User.includes(:role)
    

    这将在一个查询中获取所有具有其关联角色的用户

    【讨论】:

    • 不幸的是,这似乎不起作用。我的索引是 users = User.includes(:role) users.each do |user|将 user.role 置于 respond_with 用户我正在使用 respond_to :json (这很重要)。
    • 好的,您的问题是关于 render json 而不是查询本身。对于在 json 输出中包含内容,事情几乎相同:使用include。看这里的例子:stackoverflow.com/a/612475/1321564
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多