2012-06-25 4 views
0
class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

Foo oldFoo = Foo.new 

Foo foo = Foo.new 
foo.bars << oldFoo.bars.all.collect { |bar| bar.clone } 

La commande ci-dessus ne remplace pas correctement les bars.foo_id, les références de oldFoo.bars sont supprimées et sont définies sur foo.bars.Comment cloner une association has_many

Comment est-ce que je devrais faire ceci correctement?

Répondre

0
foo.bars << oldFoo.bars.all.collect { |bar| Bar.new(bar.attributes) } 

Une attribution d'attribut protégée entraînera cependant une erreur dans R3.2.

MISE À JOUR:

On dirait que c'est la même chose que clone, donc il n'y a pas beaucoup mieux. Si vous définissez des méthodes telles que (je les utilise beaucoup):

class Hash 
def select_at(*s_keys) 
    Hash[s_keys.zip(values_at(*s_keys))] 
    end 

    def reject_at(*r_keys) 
    select_at(keys - r_keys) 
    end 
end 

vous pouvez écrire Bar.new(bar.attributes.reject_at("id", "foo_id")).

Questions connexes