2015-06-21 47 views
0

我有一個叫Issue模式具有以下數據庫結構:導軌 - 節能與NOT NULL約束對象

class CreateIssues < ActiveRecord::Migration 
    def change 
    create_table :issues do |t| 
     t.string :path, null: false 
     t.string :filename, null: false 
     t.string :name, null: false 
     t.string :year 
     t.integer :number 
     t.timestamps null: false 
    end 
    end 
end 

在我的模型測試中,我用下面一行:

issue = Issue.create path: "test_path", filename: "test_filename", name: "test_name"

...保存時產生異常:

SQLite3::ConstraintException: NOT NULL constraint failed: 
issues.path: INSERT INTO "issues" ("created_at", "updated_at") VALUES (?, ?) 

根據我的理解,當調用createnew/save時,ra​​ils首先插入一個只帶有時間戳的條目。我期望插入包含所有我已經傳遞給create方法的值。我錯過了創作過程中的一個步驟嗎?

編輯:

基本信息和步驟:

  • 中使用sqlite3
  • 使用Rails 4.2.1
  • 使用RSpec的
  • 生成使用be rails generate model Issue
  • 問題模型增加了NULL個約束後記手工
  • 難道be rake db:migrate成功
  • 盡了各種型號規格文件
  • 代碼

嘗試過其他車型,我得到生成的SQL只包含時間戳。

編輯2: 這裏是我的問題型號:

class Issue < ActiveRecord::Base 
    has_one :pending_issue 
    has_one :watched_issue 
    has_many :unmatched_issues 

    validates :path, presence: true 
    validates :filename, presence: true 
    validates :name, presence: true 

    attr_accessor :path 
    attr_accessor :filename 
    attr_accessor :name 
    attr_accessor :year 
    attr_accessor :number 
end 
+0

這裏有些腥味 - 從一個新的應用程序開始,這段代碼對我來說工作得很好。是否有更多的代碼可以分享?或者您沿着這條路走下去的其他步驟,以達到目前的狀態? –

+0

@GavinMiller編輯儘可能詳細,因爲我可以給你 – Cubia

+0

當我在遷移中犯了一個錯字,並且必須回滾並重新遷移時,我收到了類似的錯誤。由於某些原因,測試數據庫沒有收到更改。見下面的答案。 –

回答

1

你的結果是反常的。這就是我得到:

# migration 
class CreateIssues < ActiveRecord::Migration 
    def change 
    create_table :issues do |t| 
     t.string :path, null: false 

     t.timestamps null: false 
    end 
    end 
end 

然後在控制檯:

Issue.create path: "path" 
# (0.1ms) begin transaction 
# SQL (0.3ms) INSERT INTO "issues" ("path", "created_at", "updated_at") VALUES (?, ?, ?) [["path", "path"], ["created_at", "2015-06-21 16:55:08.304653"], ["updated_at", "2015-06-21 16:55:08.304653"]] 
# (0.8ms) commit transaction 
# => #<Issue id: 1, path: "path", created_at: "2015-06-21 16:55:08", updated_at: "2015-06-21 16:55:08"> 

我的測試:

require "test_helper" 

describe Issue do 

    it "can be created" do 
    Issue.create path: "test_path" 
    end 
end 

通行證。沒有例外。

我認爲可能發生的事情是您的數據庫模式已經過時於您的測試數據庫。

首先,在開發(默認)rails控制檯中做類似的'創建'工作嗎?如果是這樣,這是一個很大的跡象表明,在你的測試和開發環境中有很大的不同。

如果您強制控制檯使用測試環境會發生什麼?

RAILS_ENV=test rails c 

它在這裏工作嗎?

我想你可能需要手動回滾測試數據庫到首次創建問題表遷移,直到達到適當的遷移,然後,再重新遷移

RAILS_ENV=test rake db:rollback 

保持應用:

RAILS_ENV=test rake db:migrate 

這有幫助嗎?

編輯:

這似乎是這個問題:

attr_accessor :path 
attr_accessor :filename 
attr_accessor :name 
attr_accessor :year 
attr_accessor :number 

這將覆蓋Rails的默認訪問器,在猜測。他們當然不需要。

+0

我可以做'rake db:reset'並從頭開始嗎? – Cubia

+0

就像你說的那樣,不起作用。在測試環境中運行控制檯會得到相同的結果,並且回滾無法解決問題 – Cubia

+0

答案已更新。刪除你的attr_accessor聲明:Rails不需要它們,它們可能會覆蓋ActiveRecord的功能。我會運行一些測試。 –

0

您是否意外忽略了attr_accessible for:path?

+0

我正在使用Rails 4.2.1,如果我沒有弄錯,attr_accessible已被棄用。 – Cubia