2009-11-05 3 views
1

J'ai un attribut agrégé que je veux pouvoir poser à propos de son _changed? ness, etc.Comment est-ce que je peux faire une propriété agrégée soutenant la sémantique ActiveRecord :: Dirty?

composed_of :range, 
      :class_name => 'Range', 
      :mapping => [ %w(range_begin begin), %w(range_end end)], 
      :allow_nil => true 

Si j'utilise l'agrégation:

foo.range = 1..10 

C'est ce que je reçois:

foo.range    # => 1..10 
foo.range_changed?  # NoMethodError 
foo.range_was   # ditto 
foo.changed    # ['range_begin', 'range_end'] 

Donc, fondamentalement, je ne reçois pas ActiveRecord :: semanitcs sales sur les attributs agrégés. Y'a-t'il un quelconque moyen d'y arriver? Vous n'avez pas beaucoup de chance avec alias_attribute_with_dirty, etc.

Répondre

0

Vous ne disposez pas de la sémantique ActiveRecord :: Dirty car les attributs agrégés ne sont pas des proxies d'association, étant de simples wrappers pour vos attributs réels - c'est pourquoi vous n'avez aucun accès à ActiveRecords grâce à eux.

Notez que foo.range_begin_changed?devrait travail, de sorte que vous pouvez essayer de voir si vous pouvez utiliser foo.class#method_missing (par exemple, défini dans un module à inclure) pour cartographier automatiquement *_was, *_changed? méthodes etc à ceux qui sont appelés attributs réels de foo.class .

Questions connexes