2010-04-28 4 views
6

J'ai quelques modèles (voir ci-dessous ArES) que je suis en train d'utiliser des associations avec (ce qui semble être entièrement en situation irrégulière et peut-être pas possible, mais je pensais que je donnerais un essai)Rails ActiveResource Les associations

Donc, de mon côté service, mon objet ActiveRecord va rendre quelque chose comme

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

(voir ci-dessous xml généré)

Le groupe modèles et les clients sont HABTM

Sur mon côté ARes, j'espère qu'il peut voir l'attribut <customers> xml et remplir automatiquement l'attribut .customers de cet objet Groupe, mais les méthodes has_many etc ne sont pas supportées (du moins autant que je sache)

Donc, je me demande comment ARes fait sa réflexion sur le XML pour définir les attributs d'un objet. En AR par exemple, je pourrais créer un def customers=(customer_array) et le définir moi-même, mais cela ne semble pas fonctionner dans ARes.

Une suggestion que je trouve pour une « association » est la méthode ont juste un

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

Mais cela présente l'inconvénient qu'il fait un deuxième appel de service pour rechercher les clients ... pas cool

Je voudrais que mon modèle ActiveResource voit que les clients attribuent dans le XML et remplissent automatiquement mon modèle. Quelqu'un a-t-il une expérience avec ceci??

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

Répondre

16

ActiveResource ne prend pas en charge les associations. Mais cela ne vous empêche pas de définir/obtenir des données complexes vers/depuis un objet ActiveResource. Voici comment je mettre en œuvre:

modèle côté serveur

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 

côté serveur GroupsController

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

modèle côté client

class Customer < ActiveResource::Base 
end 

class Group < ActiveResource::Base 
end 

côté client 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 

View Client: Accès client de l'objet Groupe

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

côté client: client Configuration à l'objet Groupe

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