2010-04-28 2 views
6

У меня есть несколько моделей АРЕС (см ниже), что я пытаюсь использовать ассоциации с (которые, как представляется, полностью документированы и, возможно, не представляется возможным, но я думал, что я дам ему попробовать)Rails ActiveResource ассоциации

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

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

(см сгенерированного XML ниже)

моделей, Группа и Клиенты HABTM

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

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

Одно предложение, которое я нашел для «ассоциации» является просто метод

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

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

Я бы хотел, чтобы моя модель ActiveResource увидела, что атрибут customers в 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> 

ответ

16

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 

стороны сервер GroupsController

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 

стороны клиента GroupsController

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