2013-10-07 3 views
1

Salut J'ai une application rails qui contient un modèle de canal. Ses attributs sont les suivants:ruby ​​first_or_create méthode ne pas mettre à jour le modèle et la base de données

# Table name: channels 
    # 
    # id    :integer   not null, primary key 
    # created_at  :datetime 
    # updated_at  :datetime 
    # channel_name :string(255) 
    # classification :string(255)  default("0") 
    # ownership  :string(255)  default("0") 

Une tâche de râteau dans mon application a lu un fichier csv et des informations dans la base de données de population. Voici un aperçu du code qui crée le modèle

...previous code........ 

    channelName = nil 
    classif = nil 
    owner = nil 
    channelName = row[0].force_encoding('UTF-8') 
    classif = row[1].force_encoding('UTF-8') 
    owner = row[2].force_encoding('UTF-8') 

if (channelName.nil?) 
     puts "Channel name for row #{i} was nil" 
     next 
    else          
     puts "Creating channel hash with information:" 
    puts "channel_name= #{channelName}" 
    puts "classification=#{classif}" 
    puts "ownership= #{owner}" 

    ch = Channel.where(:channel_name =>"#{channelName}").first_or_create do |c| 
    c.ownership = "#{owner}" 
    c.classification = "#{classif}" 

Depuis la tâche a été en mesure de lire le fichier csv et remplir la base de données, la méthode « créer » une partie de l ' « first_or_create » fonctionne. Cependant, lorsque je change certaines choses dans le fichier csv et que je refais la tâche rake, il faut mettre à jour la base de données avec le contenu modifié. Ça ne fait pas ça. Je me demande si c'est quelque chose à voir avec la syntaxe de ma méthode? la partie du bloc est-elle fausse?

+0

@dax S'il vous plaît arrêter l'édition poste de Asker, en particulier si vous supprimez juste le « merci pour votre aide » pièces ... – MrYoshiji

+0

Salut @MrYoshiji, je partais de [ce] (http: // meta. stackexchange.com/questions/122535/what-is-the-etiquette-for-adding-a-signature-to-a-question), que quelqu'un a cité en réponse à une modification de ma propre question. – dax

Répondre

0

La documentation pour first_or_create ne dit pas qu'il met à jour l'enregistrement s'il existe déjà.

  1. crée l'enregistrement s'il n'existe pas.
  2. Renvoie le dossier si elle existe déjà

Vous devez mettre à jour après que vous obtenez le dossier.

ch = Channel.where(:channel_name =>"#{channelName}").first_or_create do |c| 
    c.ownership = "#{owner}" 
    c.classification = "#{classif}" 
end 

ch.update_attribute(:attr, value) 
+1

update_attribute: (from doc): "' Met à jour un seul attribut et enregistre l'enregistrement sans passer par la procédure de validation normale "" => utiliser 'update_attributes' (pluriel) à la place, il passera par le processus de validation – MrYoshiji

Questions connexes