Model.includes(:property)似乎不起作用

时间:2011-07-04 15:02:41

标签: ruby ruby-on-rails-3 activerecord

我正在办公室开始一个小型的Rails项目来注册iOS设备,只是为了学习框架,我遇到了以下问题:

给定两个模型“Device”和“Owner”具有以下关联:

class Owner < ActiveRecord::Base
  has_many :devices
end

class Device < ActiveRecord::Base
  belongs_to :owner
  belongs_to :os_version
  belongs_to :device_type
end

架构是:

CREATE TABLE "devices" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "uuid" varchar(255), 
    "imei" varchar(255), 
    "device_type_id" integer, 
    "label" varchar(255), 
    "os_version_id" integer, 
    "owner_id" integer, 
    "created_at" datetime, 
    "updated_at" datetime, 
    "serial" varchar(255)
);
CREATE TABLE "owners" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "first_name" varchar(255), 
    "last_name" varchar(255), 
    "username" varchar(255), 
    "created_at" datetime, 
    "updated_at" datetime
);

我正在尝试让控制器急切地获取所有设备的所有者,所以我尝试了以下内容:

class OwnerController < ApplicationController

  def list
    @owners = Owner.includes(:devices).all
    respond_to do |format|
      format.xml { render :xml=>@owners } 
      format.any(:json, :html) { render :json => @owners }
    end
  end
end

控制器成功列出了所有所有者,但设备无处可寻。

我也尝试在Owner类中使用默认作用域,但仍然不行。

使用rails console时,使用Owner.include(:devices)的任何查询都无法返回设备信息,但Owner.first.devices中包含所有内容。

关于我可能做错的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:3)

您需要指定XML和JSON视图应包含设备关联:

format.xml { render :xml => @owners.to_xml(:include => :devices) } 

或者,在Rails 3中,为了让事情变得更简单:

class OwnerController < ApplicationController

  respond_to :html, :json, :xml

  def list
    @owners = Owner.includes(:devices).all
    respond_with @owners, :include => :devices
  end

end

答案 1 :(得分:3)

AFAIK,XML和JSON渲染默认情况下不渲染关联。

对于XML,您必须明确定义要渲染的关联:

format.xml  { render :xml => @owners.to_xml(:include => :devices) }

相同的原则(不同的语法)适用于JSON渲染。

HTH