12

谁能弄清楚这里发生了什么?我能够让我的代码按照我想要的方式工作,但我无法弄清楚为什么 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 检查关联表,以查看是否存在具有与 Flag 的外键匹配的 id 的行,前提是外键是 non-nil。任何人都可以对此提供任何见解吗?我是否误解了 validates_associated 应该如何工作?

4

2 回答 2

26

validates_associated只需运行在关联对象的类中指定的验证,它对外键没有任何作用。

validates :user_id, :presence=>true确保 auser_id在您的标志记录中存在,仅此而已。

validates :user, :presence=>true用于关联本身并确保正确设置了外键。

于 2011-03-03T04:20:29.157 回答
0

伙计……我得到的只是validates_presence_of你从 API 中得到的那样工作所需要的。检查关联有效性似乎有点矫枉过正,但我​​是菜鸟。

于 2011-03-03T04:07:32.293 回答