2013-06-10 16 views
6

Quindi sto cercando di impostare un valore predefinito di una colonna 'voti' su 0, ma quando creo istanze di risposte in rotaie c attraverso test di unità, il valore di voti è sempre nil . Qualche idea sul perché questo non funziona?Impostazione valori interi predefiniti in activerecord

ho cambiato la migrazione in questo modo:

class AddVotesToAnswers < ActiveRecord::Migration 
    def change 
    add_column :answers, :votes, :integer, default: 0 
    end 
end 

Ecco il modello:

class Answer < ActiveRecord::Base 
    attr_accessible :is_correct, :question_id, :title, :sms_answer_code, :votes 

    belongs_to :question 

    def upvote 
    self.votes += 1 
    end 

end 

test Spec

richiedono 'spec_helper'

describe Answer do 
    before do 
    @answer = Answer.make! 
    end 

    it "should have a default vote value of zero" do 
    binding.pry 
    @answer.votes.should eq(0) 
    end 

end 
+0

Potrebbe essere 1 di 2 cose: 1) è necessario eseguire 'rake db : test: prepara' per ottenere il valore predefinito nel database di test. 2) hai modificato il valore predefinito nella tua migrazione dopo averlo eseguito e dovresti 'rake db: migrate: redo' –

risposta

10

Il default per una migrazione DB deve essere impostato nel momento in cui si esegue la migrazione - l'aggiunta di un valore di default una volta al tavolo è stata creata vinto' lavoro.

Se il DB è già seminato (e non si vuole cambiare lo schema), il seguente gancio in ActiveRecord farà il lavoro:

class Answer < ActiveRecord::Base 
    attr_accessible :is_correct, :question_id, :title, :sms_answer_code, :votes 

    belongs_to :question 

    before_save :default_vote_count 

    def upvote 
     self.votes += 1 
    end 

    def default_vote_count 
     self.votes ||= 0 
    end 
end 

EDIT:

Se si desidera modificare il valore predefinito effettivo nel DB, è possibile creare una migrazione cambiamento contenente i seguenti:

# in console 
rails g migration change_default_for_answer_votes 

# in migration file 
class ChangeDefaultForAnswerVotes < ActiveRecord::Migration 

    def change 
    change_column :answers, :votes, :integer, :default => 0 
    end 

end 

Alcuni database (Postgres, per esempio) non assegnare automaticamente recente aggiornamento regolare valori di default Ted voci colonna esistente, quindi avrai bisogno per scorrere le risposte esistenti per aggiornare manualmente ciascuno per i voti di default contare:

# in console 
Answer.update_all(votes: 0) 
+0

Anche se immagino che non dovresti cambiare lo schema, sembra che sarebbe più sottile. –

+0

Inserisci semplicemente il suggerimento change_column. Funziona fantastico, grazie! –

1

hai bisogno di dire che, come: add_column :answers, :votes, :integer, :default => 0

+0

Questo è come ho avuto all'inizio, ma non ha funzionato. Ecco l'errore del test dell'unità: '# ./spec/models/answer_spec.rb:10:in' block (2 livelli) in ' –

+0

Questa è la sintassi per la migrazione. Potresti avere un problema nelle tue specifiche. Perché non lo pubblichi? – MERM

+0

L'ho appena aggiunto. Non penso che questo sia il problema, perché se istanzio manualmente il modello nella console, "voti" è ancora impostato su zero. Inoltre, grazie per i suggerimenti! –