谁能弄明白这里发生了什么?我能够以我想要的方式使我的代码工作,但我无法弄清楚为什么validates_associated没有按照我的预期工作。这是我的代码片段:
class Flag < ActiveRecord::Base
belongs_to :user
belongs_to :post
# allow only one flag per post per user
validates_uniqueness_of :user_id, :scope => :post_id
validates :user_id, :post_id, :presence => true
validates_associated :user, :post
attr_accessible :user_id, :post_id
end
使用此代码,我无法使用user_id == nil保存标志。我可以使用user_id == 12345保存标记(即某些user_id不在数据库中)。这就是validates_associated API规范所说的:
validates_associated(* attr_names)
验证关联的对象是否全部有效。适用于任何类型的协会。
...
注意:如果尚未分配关联,则此验证不会失败。如果您想确保关联存在且保证有效,您还需要使用validates_presence_of。
我能够通过使用它来获得所需的行为,而不是:
validates :user, :post, :presence => true
我对API规范的理解是validates_associated检查关联的表以查看是否存在一行,其id与Flag 的外键匹配,前提是外键是非零。任何人都可以对此提出任何见解吗?我是否误解了validates_associated应该如何工作?
答案 0 :(得分:26)
validates_associated
只运行在关联对象类中指定的验证,它对外键没有任何作用。
validates :user_id, :presence=>true
确保您的国旗记录中存在user_id
,但这就是全部。
validates :user, :presence=>true
用于关联本身,并确保正确设置外键。
答案 1 :(得分:0)
Man ...我得到的只是validates_presence_of
是需要的,因为你从API获得了这个。似乎是在检查关联有效性的过度杀伤,但我是一个菜鸟。