2010-02-11 5 views
0

Je cherche un bon moyen de résoudre mes problèmes de performance dans mon application rails. J'ai trois tables qui ont: une à une à plusieurs connexions entre les deux. Si je veux remplir 130 éléments de la première table avec toutes les données pour les tables sous-jacentes, il en résulte environ 1000 requêtes et prend environ 10 secondes (SQLite DB).Rails: énorme importation de données à trois tables connectées

Je trouve la déclaration

accept_nested_attributes_for

, sorcière vous permet de saisir des données pour plusieurs tables dans une ligne de code. Ma question est la suivante: est-ce une bonne option du point de vue de la performance? Est-ce que quelqu'un a de l'expérience avec ça?

Merci Markus

+0

1000 requêtes? Cela peut sembler bizarre, pourriez-vous nous montrer les détails des tables et les requêtes que vous faites, – Mike

Répondre

0

accept_nested_attributes_for ajouter la possibilité de ActiveRecord pour pouvoir écrire en association directement d'un modèle.

Exemple: Vous avez des modèles comme:

class User 
    accepts_nested_attributes_for :cars 
end 

class Car 
belongs_to :user 
end 

et un hachage comme:

param[:user] = {} 
params[:user][:name] = "Mike" 
params[:user][:car] = {} 
params[:user][:car][:brand] = "Nissan" 

User.create(params[:user]) 

Cela va créer un nouvel utilisateur et une nouvelle voiture, sans accepts_nested_attributes_for:

@user = User.create(params[:user]) 
@car = Car.create(params[:user][:car]) 
@user.car = @car 

Cette fonction est généralement avec fields_for dans les formulaires HTML afin que vous puissiez facilement gérer la création d'un objet et ses associations.

Dans votre cas, j'imagine vos modèles comme ça (au sujet de votre XML):

class Card 
    has_one :front_side, :class => "Side" 
    has_one :back_side, :class => "Side" 
end 

class Side 
    belongs_to :card 
    has_many :card_side_entry 
end 

class CardSideEntry 
    belongs_to :side 
end 

Je ne sais pas où votre XML proviennent de (vos données sont extraites de ce ??), mais j'imagine vous pouvez utiliser accept_nested_attributes_for pour que chaque hash de carte génère les associations. Mais je ne suis pas sûr de comprendre tout le problème et si c'est la meilleure solution

+0

Merci Mike, oui je le fais comme vous l'imaginiez. Je me demande si cela accepte_nested_attributes est efficace faire beaucoup de données. Merci pour votre réponse – Markus

0

ici est:

Table: cards 
front_side_id 
back_side_id 

Table: card_sides 

Table: card_side_entries 
card_side_id 

je maintenant un XML comme ceci:

<Cards> 
    <Card> 
    <FrontSide> 
     <CardSideEntries> 
     <CardSideEntrie/> 
     ... 
     </CardSideEntries> 
    </FrontSide> 
    <BackSide> 
     <CardSideEntries> 
     <CardSideEntrie/> 
     ... 
     </CardSideEntries> 
    </BackSide> 
    </Card> 
    ... 
</Cards> 

Dans ma solution, je Parse toute la ligne de fichier XML en ligne, et parce que j'ai parfois besoin d'un card_id je dois enregistrer une certaine entrée de table deux fois ... Est-ce que quelqu'un maintenant quelque chose à propos de accept_nested_attributes_for?

Merci, Markus

Questions connexes