2014-07-12 73 views
0

我試圖讓我的用戶不能創建多個服務器場。在我的用戶模型中,我有:限制用戶在has_one關係中創建一個對象

has_one :farm 

而且在我的農場模型,我有:

belongs_to :user 
validate :farm_count_within_limit, :on => :create 

def farm_count_within_limit 
    if self.user.farms(:reload).size > 1 
    errors.add(:base, "User can only add one farm") 
    end 
end 

但我收到此錯誤:

NoMethodError in FarmsController#create 

undefined method `farms' for nil:NilClass 

注意,這farm_count_within_limit前我能夠根據自己的需要創建儘可能多的農場。有沒有更好的方法來限制它,以便用戶只能添加一個農場?

回答

1

has_one將創造出奇異的farm方法這樣

user = User.find(1) 
user.farm 

沒有必要在Rails的這個額外的檢查。但是,這不會在數據庫級別強制執行,即不會有一個用戶擁有多個服務器場。防止這種情況的方法主要是創建一個唯一的索引。可以在遷移中這樣做。

add_index :farms, :user_id, unique: true 

這將確保在db中不能有多個農場的用戶。

+0

讓我清楚,我在用戶遷移文件中添加此唯一索引? –

+0

添加它的位置並不重要,可以在農場遷移或只是單獨遷移,如果你喜歡。它只需在創建農場表後運行。 – Iceman