2014-03-19 63 views
0

我有一個類別模型。我想確保用戶不會將重複的類別名稱添加到他/她的類別列表中。before_validation防止重複的類別名稱

這裏是我的類模型:

class Category < ActiveRecord::Base 
    belongs_to :user 

    validates :name, presence: true 
    validates :user_id, presence: true 
    before_validation :validate 

    private 
    def validate 
     errors.add(:name, "is already taken") if Category.where("name = '?' AND user_id = ?", self.name, self.user_id).any? 
    end 
end 

這裏是我的RSpec測試:

it "is invalid with duplicate name for same user" do 
    existing_category = Category.first 
    new_category = Category.new(:name => existing_category.name, :user_id => existing_category.user_id) 
    expect(new_category).to have(1).errors_on(:name) 
end 

我應該使用before_save或before_validate?另外,我不確定如何寫這個。我猜如果檢測到重複,我想爲:name添加一個錯誤。以上是我的嘗試,但似乎沒有讓它通過,有什麼明顯的錯誤?另外,這是添加自定義驗證的好習慣嗎?

回答

5

這裏有一個更簡單的實現你的目標 - 這樣你可以使用scope選項validates_uniqueness_of驗證的:

validates_uniqueness_of :name, scope: :user_id 

你的規格失敗,因爲它有一個錯誤。它預計new_category有錯誤,但它不會在此對象上運行驗證。爲此,您只需添加:

new_category.valid? 

之前expect#...行。

+0

不明白爲什麼這是downvoted。如果僅僅是因爲Marek沒有注意到用戶部分,但現在它已經更新,這正是OP想要的。 –

+0

@Baloo downvote已被刪除。 :) –

+0

嗨。我已將您的建議添加到模型中,謝謝。當我在rails控制檯中運行describe塊時,它似乎完成了這項工作。大! - 我想我的測試中有一個錯誤,但我無法弄清楚哪裏/爲什麼。有什麼明顯的我做錯了嗎? – Martyn