2011-09-24 41 views
0

新手問題。我想向我的聯合表模型添加一個驗證步驟,以確保在沒有包含行作爲引用的兩個表連接的情況下無法創建該類型的對象。例如:Rails多對多外鍵驗證?

class Appearance < ActiveRecord::Base 
    belongs_to :dancer 
    belongs_to :movie 
end 

class Dancer < ActiveRecord::Base 
    has_many :appearances, :dependent => :destroy, :foreign_key => 'dancer_id' 
    has_many :movies, :through => :appearances 
end 

class Movie < ActiveRecord::Base 
    has_many :appearances, :dependent => :destroy, :foreign_key => 'movie_id' 
    has_many :dancers, :through => :appearances 
end 

如何確保在舞者和電影行不存在的情況下無法創建外觀?

謝謝大家!

編輯:回答下面數的建議:

我沒有多少運氣與不幸。通過與控制檯(重新加載後)打我得到這樣的:

appearance = Appearance.new(:dancer_id = Dancer.all.first.id, :movie_id => Movie.all.first.id) 
Movie.all.first.destroy 
appearance.valid? 
=> true 

,而我期待的迴應是假的,因爲我只是核爆電影排。

+0

是的,但這是在控制檯和人爲的。這實際上是現實世界中的問題嗎?換句話說,你是否打算將外觀加載到內存中,然後刪除它的電影/舞者並嘗試保存它?如果這是一個真正的問題,'inverse_of'可能會有所幫助。我將它添加到答案中。 – numbers1311407

回答

0

你可能想驗證的存在,是這樣的:

class Appearance 
    belongs_to :movie, :inverse_of => :appearances 
    belongs_to :dancer, :inverse_of => :appearances 

    validates :movie, :dancer, :presence => true 
end 

class Movie 
    has_many :appearances, :inverse_of => :movie, ... 
end 

class Dancer 
    has_many :appearances, :inverse_of => :dancer, ... 
end 

編輯:新增inverse_of的關聯,這樣可以保持一個appearance從,如果他們dancermovie被加載後,被破壞是有效的。 (或者它可能不是,我沒有測試這個,但inverse_of的目的是提供更好的內存關聯處理)。