所以我试图将’Votes’列的默认值设置为0,但是当我在rails c或单元测试中创建答案实例时,投票值总是为零.关于为什么这不起作用的任何想法?
我这样改变了迁移:
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
解决方法
必须在运行迁移时设置数据库迁移的默认值 – 创建表后添加默认值将不起作用.
如果您的数据库已经播种(并且您不想更改架构),则ActiveRecord中的以下挂钩将完成此任务:
class Answer < ActiveRecord::Base attr_accessible :is_correct,: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,:default => 0 end end
某些数据库(例如Postgres)不会自动为现有列条目分配新更新的默认值,因此您需要迭代现有答案以手动将每个更新为默认的投票计数:
# in console Answer.update_all(Votes: 0)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。