Validation et doublons

Bonjour,

j’importe des données au format csv via rake db:migrate. jusque là
tout allait bien… Maintenant j’ai ajouté un
“validates_uniqueness_of” sur un des champs et j’ai apparemment
quelques doublons dans ma liste, ce qui fait que mon importation
bloque à chaque fois qu’elle en rencontre un.
Je sais que c’est mal… d’avoir des doublons dans une liste, mais
j’aimerais en profiter pour apprendre un peu de ROR! En fait j’ai
tenté de faire afficher la valeur en double au moment du blocage avec
une option du validate:
Mais je ne sais pas accéder à la variable qui est importée:

validates_uniqueness_of :cnpj,
:message => “le cnpj:#{ici je ne sais pas
quoi mettre } est deja utilise”

est-ce possible ???

Le mieux serait de pouvoir effectuer un traitement particulier pendant
la procédure d’importation.

Un autre question sur les migration… comment appeler le self.down ?
toujours dans migrate (pour éviter d’aller à chaque fois que je fais
un test effacer la table dans ma base).

Merci d’avance

Denis

On Dec 13, 2007 6:08 PM, Denis G. [email protected] wrote:

une option du validate:
la procédure d’importation.

Un autre question sur les migration… comment appeler le self.down ?
toujours dans migrate (pour éviter d’aller à chaque fois que je fais
un test effacer la table dans ma base).

le self.down est appelé quand tu fais un revert de version par rake
db:migrate. Tu peux l’appeler avec TaMigration.down que tu peux mettre
dans un rescue si tu veux mais ca plantera si c’est pas complet. Donc
useless.


Cyril M.

Merci Cyril,

effectivement, rake db:migrate VERSION=0, fonctionne si il n’y a pas
eu de problème lors de la migration précédente, c’est déjà là un très
bon point … (ca évite une manipe!).
maintenant pour mes doublons, il faut peut-être utiliser un rescue au
moment de la migration.up pour lui dire si il but sur une ligne (pour
cause de doublon) de passer la ligne et continuer à transférer.

je ne sais pas trop comment faire cela, je vais essayer d’encadrer le
product.save! avec un begin rescue et trouver l’exception qui va bien
(ce sera le contraire de ActiveRecord::RecordNotFound) … peut-être
ActiveRecord::RecordInvalid je vous tiens au courant…

Bonne soirée

Denis

Le 13 déc. 07 à 15:40, Cyril M. a écrit :

disons que pour ce soir c’est pas encore réglé… j’ai tenté un begin/
recue au niveau du transfert:

   begin
     product.save!
   rescue ActiveRecord::RecordInvalid
     logger.error("un doublon!")
   end

en gardant le contrôle d’unicité
t.column :cnpj, :string, :limit => 14, :unique => true

ca bloque plus mais il n’élimine pas les doublons…

je vais tenter en faisant une recherche sur ma colonne avant de
sauver…

Denis

Le 13 déc. 07 à 17:03, Denis G. a écrit :

j’ai un peu continué avec une autre idée, j’ai viré le begin rescue et
j’ai fait une recherche sur ma valeur avant chaque insertion… c’est
un peu barbare, mais cela fonctionne, voici ma portion de code dans
mon fichier de migration:

   CSV::Reader.parse(File.open("#{RAILS_ROOT}/db/

listaClients.csv", ‘rb’)) do |row|
test = Company.find(:first, :conditions => “cnpj=’#{row[2]}’”)
if(test == nil)
this_row = {
:razao_social => row[0],
:nome_fantasia => row[1],
:cnpj => row[2],
:rua => row[3],
:cep => row[4],
:bairro => row[5],
:cidade => row[6],
:estado => row[7],
:telefone => row[8]
}
company = Company.new(this_row)
company.save!
else
printf(“elimination doublon!: %s\n”, row[2])
end
end

dans mon cas je ne teste qu’un champs, car il doit être unique, si on
test sur plusieurs avec beaucoup de données… ca doit prendre plus de
temps.
Ici le remplissage de la table a duré 36,78 s pour environs 2392
enregistrements (2283 après élimination des doublons), sans filtrer
les doublons l’importation a duré 33,83s cela fait environs 10% de
temps en plus (moins de 4s pour filtrer).

Bonne
soirée
Denis