我正在办公室开始一个小型的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
中包含所有内容。
关于我可能做错的任何想法?
谢谢!
答案 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