2011-04-16 97 views
89

我有一個與另一個模型B有「has_many」關聯的模型A.我有一個業務需求,插入到A需要至少1個關聯的記錄到B.是否有一個方法,我可以調用以確保這是真的,還是我需要編寫自定義驗證?Rails - 驗證存在的關聯?

回答

140

您可以使用validates_presence_ofhttp://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

class A < ActiveRecord::Base 
    has_many :bs 
    validates_presence_of :bs 
end 

或只是validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base 
    has_many :bs 
    validates :bs, :presence => true 
end 

但是有它的錯誤,如果你會使用accepts_nested_attributes_for:allow_destroy => trueNested models and parent validation。在這個主題中你可以找到解決方案。

+3

'的has_many:bs' lulz – Archonic 2016-10-28 00:24:37

6

您可以驗證關聯與validates_existence_of(這是一個插件):

實施例從this blog entry片段:

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :taggable, :polymorphic => true 
    validates_existence_of :tag, :taggable 

    belongs_to :user 
    validates_existence_of :user, :allow_nil => true 
end 

備選地,可以使用validates_associated。由於Faisal notes in the comments低於答案,validates_associated通過運行關聯的類驗證來檢查關聯的對象是否有效。它確實不是檢查存在。注意到一個無關聯被認爲是有效的也很重要。

14

--------軌道4 ------------

簡單validatespresence工作對我來說

class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates :user, presence: true 
end 

class User < ActiveRecord::Base 
    has_one :profile 
end 

這樣,Profile.create現在將失敗。我必須在保存profile之前使用user.create_profile或關聯用戶。

0

如果你想確保該組織是當前和保證是有效的,你還需要使用

class Transaction < ActiveRecord::Base 
    belongs_to :bank 

    validates_associated :bank 
    validates :bank, presence: true 
end