Après avoir fait quelques farfouillé, on dirait qu'il est un peu plus compliqué que cela. Mon poking a fait le tour comme ceci:
- J'ai créé une paire de modèles, Parent et enfant avec une
has_many
relation dans un rail app jetables.
- J'ai ouvert
script/console
et poussé autour.
J'ai créé un nouveau parent avec un enfant et les délivra
>> p = Parent.new;p.children << Child.new(:foo=>'bar');p.save
=> true
Voir l'enfant est dans la db et trouvable by_foo
>> p.children.find_by_foo('bar')
=> #<Child id: 1, foo: "bar", parent_id: 1, created_at: "2009-12-14 22:08:05", updated_at: "2009-12-14 22:08:05">
j'ai ajouté un autre enfant à la collecte, il apparaît dans p.children
mais pas dans les méthodes de collecte qui touchent la base de données.
>> p.children << Child.new(:foo=>'bar')
=> [#<Child id: 1, foo: "bar", parent_id: 1, created_at: "2009-12-14 22:08:05", updated_at: "2009-12-14 22:08:05">, #<Child id: 2, foo: "bar", parent_id: 1, created_at: "2009-12-14 22:08:25", updated_at: "2009-12-14 22:08:25">]
>> p.children.find_by_foo('bar')
=> #<Child id: 1, foo: "bar", parent_id: 1, created_at: "2009-12-14 22:08:05", updated_at: "2009-12-14 22:08:05">
Je change l'enfant qui est dans le db.
>> p.children[0].foo = 'baz'
=> "baz"
Lorsque je le cherche, il me donne la version db.
>> p.children.find_by_foo('bar')
=> #<Child id: 1, foo: "bar", parent_id: 1, created_at: "2009-12-14 22:08:05", updated_at: "2009-12-14 22:08:05">
Mais, la collection locale est inchangée.
>> p.children
=> [#<Child id: 1, foo: "baz", parent_id: 1, created_at: "2009-12-14 22:08:05", updated_at: "2009-12-14 22:08:05">, #<Child id: 2, foo: "bar", parent_id: 1, created_at: "2009-12-14 22:08:25", updated_at: "2009-12-14 22:08:25">]
Donc, si vous enregistrez de nouveau p, il transmettra les modifications.Si vous voulez obtenir tous les objets d'association locale, y compris ceux qui ont été modifiés, vous ne pouvez pas utiliser les moteurs de recherche ActiveRecord car ils utilisent la méthode db, utilisez plutôt les méthodes de tableau comme vous l'avez fait plus haut. Bien, en utilisant find_all
ou select
serait plus facile à comprendre
parent.children.select{|c| c.attr == 'foo'}