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
とにかくリンクされたレコードを独立して検証しているので、単にディレクティブを削除しました。