Model.includes (: свойство), казалось бы, не работает - PullRequest
0 голосов
/ 04 июля 2011

Я запускаю небольшой проект Rails, чтобы зарегистрировать устройства iOS здесь, в офисе, просто для изучения инфраструктуры, и я столкнулся со следующей проблемой:

Учитывая две модели: «Устройство» и «Устройство».Владелец "со следующими ассоциациями:

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 ]

3 голосов
/ 04 июля 2011

AFAIK, рендеры XML и JSON по умолчанию не отображают ассоциатов.

Для XML вам необходимо явно указать, какие ассоциации вы хотите визуализировать:

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

Тот же принцип (другой синтаксис) применяется к рендерингу JSON.

HTH

3 голосов
/ 04 июля 2011

Вы должны указать, что ваши представления 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...