J'ai la situation suivante avec ActiveRecord (dans Rails 2.3.8):ActiveRecord a été modifié? drapeau ne signale pas de changements chez les enfants associés
class Order < ActiveRecord::Base
has_many :documents
accepts_nested_attributes_for :documents
end
class Document <ActiveRecord::Base
belongs_to :order
end
Maintenant, dans un contrôleur que je veux diriger l'utilisateur différemment selon ou non ils ont apporté des modifications aux enregistrements existants, par exemple
@order.attributes = params[:order]
if @order.changed?
# save order
# redirect one place
else
# redirect another place
end
Pour cela, je veux utiliser le changé? drapeau. Il s'avère que @ order.changed? ne questionne pas les enfants.
J'ai essayé de mettre en œuvre que par une méthode proxy d'association sur la has_many: documents association, comme ceci:
has_many :documents do
def changed?
any? {|doc| doc.changed?}
end
end
Mais ce qui a pour effet secondaire involontaire qu'il charge les documents associés à partir du disque, qui, apparemment, efface toutes les modifications qui ont été faites dans l'attribution des attributs imbriqués dans @ order.attributes = params [: order] Cela semble soit une décision de conception intentionnelle dans Rails, mais alors comment le résoudre? Ou est-ce un écart de fonctionnalité?
Pensées?
Loup
exigent la classe 'dm-core' REQUIRE migrations dm-' require 'dm-accepts_nested_attributes' Commander comprennent DataMapper :: ressources propriété: id, série a n,: documents accepts_nested_attributes_for: documents fin classe document comprennent DataMapper :: ressources propriété: id, série propriété: foo, String belongs_to: pour fin données Mapper.setup (: par défaut, 'sqlite :: memory:') DataMapper.auto_migrate! @o = Order.create @ o.attributes = {'documents' => [{'foo' => 'bar'}]} @ o.documents.any? {| doc | doc.dirty?} – Reactormonk