2013-07-27 27 views
18

Tôi đã làm việc trên một ứng dụng Rails 4.0 với sqlite (mặc định cho Rails môi trường phát triển) cho các sự kiện (hackathons) có một mô hình cha, Sự kiện, mà có thể có nhiều Press_Blurbs.Rails 4: schema.db cho thấy "Không thể đổ bảng" sự kiện "vì sau NoMethodError # undefined phương pháp` [] 'cho nil: NilClass "

Trước tiên tôi chạy một số máy phát điện giàn giáo mà tạo ra một số di cư có thể tôi chạy dường như không có vấn đề:

class CreateEvents < ActiveRecord::Migration 
    def change 
    create_table :events do |t| 
     t.string :city 
     t.string :theme 
     t.datetime :hackathon_start 
     t.datetime :hackathon_end 
     t.datetime :show_start 
     t.datetime :show_end 
     t.text :about 
     t.string :hack_rsvp_url 
     t.string :show_rsvp_url 

     t.timestamps 
    end 
    end 
end 

class CreatePressBlurbs < ActiveRecord::Migration 
    def change 
    create_table :press_blurbs do |t| 
     t.string :headline 
     t.string :source_name 
     t.string :source_url 
     t.string :logo_uri 

     t.timestamps 
    end 
    end 
end 

Sau đó, tôi đã thêm một số mối quan hệ với các mô hình:

class Event < ActiveRecord::Base 
    has_many :press_blurbs 
end 

class PressBlurb < ActiveRecord::Base 
    belongs_to :event 
end 

... và thêm/chạy di chuyển để thêm tham chiếu bảng:

class AddEventRefToPressBlurbs < ActiveRecord::Migration 
    def change 
    add_column :press_blurbs, :event, :reference 
    end 
end 

Tuy nhiên, khi tôi nhìn tại schema.db đây là những gì tôi thấy thay vì các định nghĩa bảng:

# Could not dump table "events" because of following NoMethodError 
# undefined method `[]' for nil:NilClass 

# Could not dump table "press_blurbs" because of following NoMethodError 
# undefined method `[]' for nil:NilClass 

Các bảng không liên quan khác hiển thị trong giản đồ.rb hoàn toàn tốt, nhưng không có. Có ai biết cái gì đang xảy ra không?

+0

Khi bạn chạy 'rake db: migrate' có cập nhật lược đồ không? –

+0

Không. : (Các tập tin vẫn giữ nguyên như số phiên bản – huertanix

Trả lời

20

Tôi nghĩ lần di chuyển cuối cùng của bạn là sai. Tôi sẽ thay đổi nó như thế này:

class AddEventRefToPressBlurbs < ActiveRecord::Migration 
    def change 
    add_reference :press_blurb, :event 
    end 
end 

Thật không may, cơ sở dữ liệu của bạn có thể ở trong tình trạng rung rinh vì nó có một loại cột không hợp lệ (ví dụ: không có 'tham khảo' loại cột, nhưng sqlite đã làm cho nó anyway). Hy vọng rằng, nó chỉ là một cơ sở dữ liệu phát triển, do đó bạn chỉ có thể xóa nó và bắt đầu mới.

+1

Yup, đó là một DB dev chỉ có một bản ghi trong đó; Thay đổi di chuyển để tạo cột "event_id" và sử dụng kiểu dữ liệu nguyên và tái tạo DB đã làm – huertanix

+0

Làm thế nào bạn thả cơ sở dữ liệu và tạo lại DB? – camdixon

+8

'bó exec rake db: reset' thường có hiệu quả, nhưng khi schema.rb của bạn sai, một cái gì đó giống như' bundle exec rake db: drop db: create db: migrate' hoạt động tốt hơn. –

0

Chỉ trong trường hợp điều này giúp người khác. Tôi đã làm điều này trên một db dev sqlite, và như đã đề cập ở trên, nó có khả năng trong một trạng thái chiến thắng từ tất cả các di chuyển thử nghiệm của tôi. Bằng cách xóa các tập tin sqlite, tái tạo và chạy tất cả các di chuyển, nó bây giờ là tốt.

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