Rails ActiveResource Ассоциации - PullRequest
       25

Rails ActiveResource Ассоциации

6 голосов
/ 29 апреля 2010

У меня есть некоторые модели ARes (см. Ниже), с которыми я пытаюсь использовать ассоциации (которые кажутся полностью недокументированными и, возможно, не возможными, но я решил попробовать)

Так что на моей стороне обслуживания мой объект ActiveRecord будет отображать что-то вроде

render :xml => @group.to_xml(:include => :customers)

(см. Сгенерированный XML ниже)

Модели и клиенты - HABTM

Со своей стороны AR, я надеюсь, что он может видеть атрибут <customers> xml и автоматически заполнять атрибут .customers этого объекта Group, но методы has_many и т. Д. Не поддерживаются (по крайней мере, до тех пор, пока Могу сказать)

Так что мне интересно, как ARes отражает XML, чтобы установить атрибуты объекта. Например, в AR я мог бы создать def customers=(customer_array) и установить его сам, но в ARes это не работает.

Одним из предложений, которое я нашел для "ассоциации", является метод "просто есть"

def customers
  Customer.find(:all, :conditions => {:group_id => self.id})
end

Но это имеет тот недостаток, что делает второй сервисный звонок для поиска этих клиентов ... не круто

Мне бы хотелось, чтобы моя модель ActiveResource видела, что клиенты атрибутов в XML, и автоматически заполняет мою модель. Кто-нибудь имеет опыт работы с этим ??

# My Services
class Customer < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :customer
end

# My ActiveResource accessors
class Customer < ActiveResource::Base; end
class Group < ActiveResource::Base; end

# XML from /groups/:id?customers=true

<group>
  <domain>some.domain.com</domain>
  <id type="integer">266</id>
  <name>Some Name</name>
  <customers type="array">
    <customer>
      <active type="boolean">true</active>
      <id type="integer">1</id>
      <name>Some Name</name>
    </customer>
    <customer>
      <active type="boolean" nil="true"></active>
      <id type="integer">306</id>
      <name>Some Other Name</name>
    </customer>
  </customers>
</group>

1 Ответ

16 голосов
/ 29 апреля 2010

ActiveResource не поддерживает ассоциации. Но это не мешает вам устанавливать / получать сложные данные в / из объекта ActiveResource. Вот как я бы это реализовал:

Модель на стороне сервера

class Customer < ActiveRecord::Base
  has_and_belongs_to_many :groups
  accepts_nested_attributes_for :groups
end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :customers
  accepts_nested_attributes_for :customers
end

Контроллер групп на стороне сервера

def show
  @group = Group.find(params[:id])
  respond_to do |format|
    format.xml { render :xml => @group.to_xml(:include => :customers) }
  end    
end

Модель на стороне клиента

class Customer < ActiveResource::Base
end

class Group < ActiveResource::Base
end

Контроллер групп на стороне клиента

def edit
  @group = Group.find(params[:id])
end

def update
  @group = Group.find(params[:id])
  if @group.load(params[:group]).save
  else
  end
end

Просмотр клиента: доступ к клиенту из объекта группы

# access customers using attributes method. 
@group.customers.each do |customer|
  # access customer fields.
end

Сторона клиента: установка клиента для объекта группы

group.attributes['customers'] ||= [] # Initialize customer array.
group.customers << Customer.build
...