Rails-验证关联的存在? ?

我有一个模型 A,有一个“ has _ many”关联到另一个模型 B。我有一个业务需求,一个插入到 A 需要至少一个关联记录到 B。是否有一个方法我可以调用来确保这是真的,或者我需要写一个自定义验证?

70002 次浏览

You can validate associations with validates_existence_of (which is a plugin):

Example snippet from 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

Alternatively, you can use validates_associated. As Faisal notes in the comments below the answer, validates_associated checks if the associated object is valid by running the associated class validations. It does not check for the presence. It's also important to note that a nil association is considered valid.

You can use validates_presence_of http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

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

or just validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

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

But there is a bug with it if you will use accepts_nested_attributes_for with :allow_destroy => true: Nested models and parent validation. In this topic you can find solution.

-------- Rails 4 ------------

Simple validates presence worked for me

class Profile < ActiveRecord::Base
belongs_to :user


validates :user, presence: true
end


class User < ActiveRecord::Base
has_one :profile
end

This way, Profile.create will now fail. I have to use user.create_profile or associate a user before saving a profile.

If you want to ensure that the association is both present and guaranteed to be valid, you also need to use

class Transaction < ActiveRecord::Base
belongs_to :bank


validates_associated :bank
validates :bank, presence: true
end