2014-01-20 16 views
0

我在兩個表之間有has_and_belongs_to_many關係:usersrolesHas_and_belongs_to_many找到是否存在

當我添加到連接表時,如何防止重複項,以便同一個用戶在同一個角色不能被添加兩次(如檢查該行是否已經存在)。我知道有一個find函數,但我不認爲這就是我正在尋找的。任何幫助,將不勝感激。

role = Role.find(params[:role_id]) 
user = User.find(params[:user_id]) 
role.users << user 

回答

2

添加您的habtm聲明中uniq: true檢查將排序的幫助 - 它會忽略在你的連接表中已經存在的重複:

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users, :uniq => true 
end 

如果你想保留複製出來的首先要連接表,您必須將連接表升級爲第一級連接模型(並使用has_many-through而不是habtm),您可以在其中聲明validate_uniqueness_of,或者可以使用habtm並提供自定義驗證回調:

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users, :before_add => :validate_not_duplicate 

    private 

    def validate_not_duplicate(user) 
    raise 'some error' if users.include? user 
    end 
end 

不幸的是,設置錯誤標誌或返回false不會阻止模型被添加到連接表 - 您需要引發某種異常。也許這將是一個很好的激勵,有些人遠離habtm ...

+0

這是完美的,但有沒有辦法提醒用戶使用「閃光燈」,它已經存在? – evanvee

+0

@evanvee - 用這個更新,你需要捕捉拋出的錯誤來確定這是否發生。無論是或不使用habtm。 – PinnyM

+0

這是完美的。謝謝! – evanvee