在activerecord中设置默认整数值

时间:2013-06-10 02:05:46

标签: ruby-on-rails activerecord migration default-value

所以我试图将'votes'列的默认值设置为0,但是当我在rails c或单元测试中创建答案实例时,投票值始终为nil。关于为什么这不起作用的任何想法?

我已经改变了迁移方式:

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

以下是模型:

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

测试规范

要求'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

2 个答案:

答案 0 :(得分:10)

必须在运行迁移时设置数据库迁移的default - 创建表后添加默认值将不起作用。

如果您的数据库已经播种(并且您不想更改架构),则ActiveRecord中的以下挂钩将完成此任务:

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

编辑:

如果要更改数据库中的实际默认值,可以创建包含以下内容的更改迁移:

# 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

某些数据库(例如Postgres)不会自动将新更新的默认值分配给现有列条目,因此您需要迭代现有答案以手动将每个数据库更新为默认投票数:

# in console
Answer.update_all(votes: 0)

答案 1 :(得分:1)

你需要说: add_column :answers, :votes, :integer, :default => 0