2010-04-28 12 views
6

tengo algunos modelos Ares (véase más adelante) que estoy tratando de utilizar las asociaciones con (lo que parece ser totalmente indocumentado y tal vez no sea posible, pero pensé que le daría una oportunidad)rieles ActiveResource

Así que en mi lado del servicio, mi objeto ActiveRecord hará que algo así como

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

(ver XML generado más adelante)

El Grupo de modelos y clientes son HABTM

En mi lado de ARes, espero que pueda ver el atributo <customers> xml y llenar automáticamente el atributo .customers de ese objeto de grupo, pero los métodos has_many etc. no son compatibles (al menos hasta donde puedo decir)

Así que me pregunto cómo hace ARes su reflexión sobre el XML para establecer los atributos de un objeto. En AR, por ejemplo, pude crear un def customers=(customer_array) y configurarlo yo mismo, pero esto no parece funcionar en ARes.

Una sugerencia que encontré para una "asociación" es el justo tienen un método

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

Pero esto tiene el inconveniente de que hace una segunda llamada de servicio para buscar aquellos clientes ... no se refresca

Me gustaría que mi modelo ActiveResource para ver que los clientes atribuyen en el XML y llenar automáticamente mi modelo. ¿¿Alguien tiene alguna experiencia con esto??

# 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> 

Respuesta

16

ActiveResource no admite asociaciones. Pero no le impide configurar/obtener datos complejos a/desde un objeto ActiveResource. Aquí es cómo iba a ponerlo en práctica:

modelo del lado del servidor

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 

servidor GroupsController lado

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

modelo del lado del cliente

class Customer < ActiveResource::Base 
end 

class Group < ActiveResource::Base 
end 

cliente GroupsController Vista

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

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

Cliente: Acceso al cliente de objeto Grupo

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

lado del cliente: Configuración del cliente a objeto Grupo

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