0

Railsで非常に奇妙な問題が発生しています。親オブジェクトで使用update_attributesして、すべての子オブジェクトを更新しています。子オブジェクトには(カスタム)検証があり、実際これは問題なく機能します。つまり、間違った値を指定すると、検証トリガーが発生し、エラーが返されます。

今、私はデータベースでモデルの1つが無効であるという奇妙な状況にあります(理由は疑問に思わないでください。DBにアクセスしてSQLを実行し、モデルを無効にできるとしましょう)。アプリにアクセスすると、無効な値が表示されますが、これで問題ありません。値を修正して再度保存すると、新しい値を保存する前に検証も呼び出されることがわかります。つまり、エラーが発生し、RailsがSQLを実行して値を実際に更新することはありません。正しいもの。

上記が理にかなっていることを願っています。何かアイデアはありますか、それとも私が見落としていることがあると思いますか?

解決:

何が起こっていたのかというと、多対多の関係が、新しいデータに置き換えられる前に既存のDBデータを検証していたということでした。基本的に構造は次のようになりました。

class User
    has_many :user_permissions
    has_many :permissions, :through => :model_permissions

class Permission
    has_many :user_permissions
    has_many :users, :through => :user_permissions

class UserPermission
    belongs_to :user
    belongs_to :permission
    validates_associated :user       # THIS was causing the problem
    validates_associated :permission # and THIS as well

validates_associatedとにかくリンクされたレコードを独立して検証しているので、単にディレクティブを削除しました。

4

1 に答える 1

0

Railsはデータベースにデータを書き込む前に検証を実行します(Active Recordコールバックシーケンスを参照してください)。したがって、検証エラーがあるということは、保存しようとしているモデルの一部が無効であることを意味します。検証がオンになっているエラーを含む関連モデル、または一部の欠落部分が含まれている可能性があります。いずれの場合も、発生しているエラーを確認してください。

検証をスキップしたい場合(理由は間違いありません:)-#update_attribute(1つの属性のみを更新する)から選択するか、#save(false)を呼び出すか、モデルクラスの+ udpate_allメソッドを使用するか、またはActiveRecord :: Base.connection.executeまで–これらのどれも検証エラーであなたを悩ませることはありません:)

于 2012-11-09T17:47:03.897 に答える