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_associatedAPI仕様の内容です。

validates_associated(* attr_names)

関連する1つまたは複数のオブジェクトがすべて有効であるかどうかを検証します。あらゆる種類のアソシエーションで動作します。
...
注:関連付けが割り当てられていない場合、この検証は失敗しません。アソシエーションが存在し、有効であることが保証されていることを確認する場合は、validates_presence_ofも使用する必要があります。

代わりに、これを使用して目的の動作を得ることができました。

  validates :user, :post, :presence => true

API仕様についての私の理解は、validates_associedが関連するテーブルをチェックして、外部キーがnil以外の場合に、 Flagの外部キーと一致するIDを持つ行が存在するかどうかを確認することです。誰かがこれについて何か洞察を提供できますか?validates_associatedがどのように機能するのか誤解していますか?

4

2 に答える 2

26

validates_associated関連するオブジェクトのクラス内で指定された検証を実行するだけで、外部キーに関しては何もしません。

validates :user_id, :presence=>trueuser_idフラグレコードにが存在することを確認しますが、それだけです。

validates :user, :presence=>trueアソシエーション自体で使用され、外部キーが適切に設定されていることを確認します。

于 2011-03-03T04:20:29.157 に答える
0

男...私が得たvalidates_presence_ofのは、APIから得たようにこれが機能するために必要なことだけでした。アソシエーションの有効性をチェックするのはやり過ぎのようですが、私は初心者です。

于 2011-03-03T04:07:32.293 に答える