0

來自this後&它說DB處理的參照完整性根本不是Rails方式。Rails 3中的Postgresql參照完整性約束條件

但想一想:

class User < ActiveRecord::Base 
    belongs_to :department 
end 

class Department < ActiveRecord::Base 
    has_many :users 
end 

#User Model 
id: integer, name: string,department_id: integer 
#Department Model 
id: integer, name: string 

在這裏,我需要創建一個新的用戶&強制執行以下規則

  • 用戶應該被分配到一個部門
  • users.department_id應該匹配departments.id
  • if users.department_id與不匹配,不應創建記錄&提出錯誤。

現在,我該如何在rails方式下完成這項工作?或者通過在遷移中刪除原始SQL來添加外鍵是唯一的方法嗎?允許保存操作之前

validates_presence_of :department 

Rails會檢查是否有一個有效的部門:

+5

的‘Rails的方式’掛鉤是頭腦簡單的,愚蠢的,並受競爭情況(其他中事情)。如果你關心你的數據,你會在數據庫中使用真正的FK,[外國人](https://github.com/matthuhiggins/foreigner)會幫助你,直到Rails開始改變態度,良好的感覺。 –

+0

是的,它似乎很奇怪,但嘿,鐵軌是一個固執己見的軟件:) – CuriousMind

+0

但是他們的邏輯有漏洞,他們讓他們的態度得到堅實的軟件的方式。至少他們承認他們在[驗證指南](http://guides.rubyonrails.org/active_record_validations_callbacks.html#why-use-validations)中唯一性的缺點。我已經看到了足夠*不可能*事情發生得更好,我至少和Rails一樣被認爲是:) –

回答

1

在Rails中,你只需添加到您的用戶模型。如果你願意的話,你也可以像老外一樣使用寶石來爲你的表添加外鍵。我通常這樣做是因爲我不可避免地發現自己需要在某個時候直接批量加載數據。

+0

我已經有了這個驗證,但我正在驗證'department_id'。將其更改爲「部門」,現在它可以工作。但我想知道它爲什麼現在起作用並且沒有提前工作? – CuriousMind

+0

如果您驗證ID的存在,請確保ID字段已填充,但如果ID實際引用現有的行,則不能。通過驗證關聯,確保有一個由該ID引用的匹配行。 –

1

如果盧卡斯的回答不適合你的需求,你也可以使用前/後保存在模型上

class User < ActiveRecord::Base 

    before_save :validate_department 

    def validate_department 
    #validate the department 
    #raise an error if invalid? 
    end 

end