2013-06-10 40 views
6

Vì vậy, tôi đang cố gắng đặt giá trị mặc định của cột 'phiếu bầu' thành 0, nhưng khi tôi tạo trường hợp câu trả lời trong đường ray c hoặc thông qua kiểm tra đơn vị, giá trị phiếu luôn là nil . Bất kỳ ý tưởng về lý do tại sao điều này không hoạt động?Đặt giá trị số nguyên mặc định trong activerecord

Tôi đã thay đổi sự di cư như vậy:

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

Dưới đây là mô hình:

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 

thử nghiệm Spec

require '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

Có thể là 1 trong 2 điều: 1), bạn cần phải chạy 'rake db : test: preparation' để lấy giá trị mặc định trong cơ sở dữ liệu thử nghiệm của bạn. 2) bạn đã chỉnh sửa giá trị mặc định trong quá trình di chuyển của mình sau khi chạy nó và nên 'rake db: migrate: redo' –

Trả lời

10

Các default cho một sự chuyển đổi DB phải được thiết lập vào thời điểm mà tại đó bạn chạy di cư - thêm một giá trị mặc định một lần một bảng đã được tạo won' t làm việc.

Nếu DB của bạn đã được hạt giống (và bạn không muốn thay đổi schema), móc sau trong ActiveRecord sẽ thực hiện công việc:

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:

Nếu bạn muốn thay đổi giá trị mặc định thực tế trong DB, bạn có thể tạo chuyển đổi thay đổi có chứa các thông tin sau:

# 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 

Một số cơ sở dữ liệu (Postgres chẳng hạn) không tự động gán mới cập nhật giá trị mặc định ted đến mục cột hiện có, vì vậy bạn sẽ cần phải lặp qua câu trả lời hiện có để tự cập nhật mỗi số phiếu mặc định đếm:

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

Mặc dù tôi đoán bạn không được phép thay đổi giản đồ, có vẻ như nó sẽ mỏng hơn. –

+0

Chỉ cần đặt trong mẹo change_column. Hoạt động tuyệt vời, cảm ơn! –

1

Bạn cần phải nói rằng như: add_column :answers, :votes, :integer, :default => 0

+0

Đó là cách tôi đã có nó lúc đầu nhưng nó không hoạt động. Đây là lỗi từ kiểm tra đơn vị: '# ./spec/models/answer_spec.rb:10:in 'khối (2 cấp độ) trong ' –

+0

Đó là cú pháp cho việc di chuyển. Bạn có thể gặp sự cố trong thông số của mình. Tại sao bạn không đăng nó – MERM

+0

Chỉ cần thêm nó. Tôi không nghĩ rằng đó là vấn đề mặc dù bởi vì nếu tôi tự khởi tạo mô hình trong giao diện điều khiển, 'phiếu bầu' vẫn mặc định là không. Ngoài ra, cảm ơn lời khuyên! –

Các vấn đề liên quan