2012-08-15 4 views
5

Ich habe die Modelle Kategorie und Produkte. Wenn ich category.products << new_product verwende, wird das Element zum Array hinzugefügt und der Datensatz wird in der Datenbank gespeichert. Ich habe versucht, die folgende "add" -Methode zu der Array-Klasse hinzuzufügen und während es das neue Produkt zum Array hinzufügt, speichert es es nicht in der Datenbank. Warum das?Add-Methode zu ActiveRecord Array hinzufügen

class Array 
    def add(item) 
    self << item 
    end 
end 

Update:

collection_proxy.rb wurde das folgende Verfahren:

def <<(*records) 
    proxy_association.concat(records) && self 
end 
alias_method :push, :<< 

So ist die folgende Erweiterung funktioniert:

class ActiveRecord::Relation 
    def add(*records) 
    proxy_association.concat(records) && self 
    end 
end 

Lösung:

einen Alias ​​zum CollectionProxy hinzufügen:

class ActiveRecord::Associations::CollectionProxy 
    alias_method :add, :<< 
end 
+0

Da Rails Assoziationen sind keine Arrays, sie behaupten, nur sie sind . –

+0

Was sind sie dann? Wie kann ich eine "Add" -Methode hinzufügen? – Manuel

Antwort

2

Edit: Manuel eine bessere Lösung gefunden

class ActiveRecord::Associations::CollectionProxy 
    alias_method :add, :<< 
end 

Original-Lösung:

Dies sollte Sie loslegen. Es ist nicht perfekt.

class ActiveRecord::Relation 
    def add(attrs) 
    create attrs 
    end 
end 

Anstatt einen neuen Schienen-Projekt mit dem Modellnamen anwerfen, habe ich nur ein ich für das folgende Beispiel hatte:

1.9.3p194 :006 > Artist.create(:first_name => "Kyle", :last_name => "G", :email => "[email protected]") 
=> #<Artist id: 5, first_name: "Kyle", last_name: "G", nickname: nil, email: "[email protected]", created_at: "2012-08-16 04:08:30", updated_at: "2012-08-16 04:08:30", profile_image_id: nil, active: true, bio: nil> 
1.9.3p194 :007 > Artist.first.posts.count 
=> 0 
1.9.3p194 :008 > Artist.first.posts.add :title => "Foo", :body => "Bar" 
=> #<Post id: 12, title: "Foo", body: "Bar", artist_id: 5, created_at: "2012-08-16 04:08:48", updated_at: "2012-08-16 04:08:48"> 
1.9.3p194 :009 > Artist.first.posts.count 
=> 1 
+0

Danke. Wissen Sie, warum es fehlschlägt, wenn Sie den neuen Datensatz nicht als Hash hinzufügen, sondern ein Objekt übergeben? (Ich bekomme "NoMethodError: undefined Methode' strainify_keys '") – Manuel

+0

@Manuel ja,' add' ruft 'create' und erwartet Attribute als Hash. Sie könnten die Methode in etwas wie 'create item.attributes' ändern, aber Sie könnten Probleme mit geschützten Attributen bekommen. Überlege dir, welche du vom Objekt auswählen musst. – Kyle

+0

Nicht ganz :(create item.attributes erstellt den Datensatz in der Datenbank, macht aber keine Beziehung (in Ihrem Fall ist artist_id null). – Manuel

Verwandte Themen