2014-01-17 14 views
0

My Rails應用程序使用Postgres支持的ActiveRecord。我通過psql進入數據庫,並從其中一個表中刪除了一行。事後看來,這是一個糟糕的決定,因爲它導致部分應用崩潰,試圖引用該對象。手動刪除postgresql中的一行,現在ActiveRecord正在打破

事情是這樣:

undefined method `first_name' for nil:NilClass 

或者

Couldn't find Person with id=137 

所以現在我有兩個問題。

  1. 我該如何解決這個問題?

  2. 操縱數據是通過rails console production手動更新它的最好方法嗎?或者我是否應該避免這種情況?的代碼

Reward.all.order("created_at DESC").where(warning: false, created_at: @yearrange).page(params[:page]) 

凡獎賞包含對人物ID

+0

您是否從'id = 137'的人中刪除了? –

+0

是的,ID爲137的人很可能是我刪除的對象。 – ranonk

+3

用手把它放回去或追蹤引用它的所有內容並修復那些懸掛的引用。然後看看外國人的寶石,並開始在數據庫中使用真正的FKs,以便數據庫可以保護您免受這種數據損壞。 –

回答

0

相反的參考到例如PHP,ruby/Rack應用程序(例如Rails)會在內存中加載以供後續請求使用。有機會引用舊數據在某處緩存中引用。嘗試讓應用程序服務器重新加載以解決問題。

更可能的罪魁禍首,就是說,memcached或類似的,如果你使用這樣的事情。根據需要衝洗它。

對於Rails來說,我不太瞭解這個最後一點,但我會想象Rails控制檯使用應用程序的代碼流並在需要時刷新緩存。


注:如在評論@muistooshort點出來,它也可能成爲懸空外鍵的地方,如果你沒有創建您的模式的FK cnstraints。

+0

我已經嘗試重新啓動服務器,但它仍然發生。我不相信應用程序正在使用memcache(我沒有寫出原始項目)。 – ranonk

+0

@Denis Eep,真的嗎?我想要聽/通知緩存失效或什麼的。它是否只是盲目地認爲沒有人會同時搞亂相同的數據? –

+2

因爲Rails認爲「數據庫中的邏輯」不好,像「通過真正的FKs進行數據完整性」這樣愚蠢的事情被認爲是「邏輯」(壞邏輯!壞!)坐在角落裏!)。對不起,如果我聽起來有點痛苦,作爲Rails-land中的數據庫傢伙很困難。 –