6

So habe ich Code in meiner Anwendung, die wie so mit dem "< <" Betreiber eine has_many Beziehung anfügt:Rails Active Schaufel (<<) Operator

class BlogPost < ActiveRecord::Base  
    has_many :comments 

    def add_comment(content) 
     @new_comment = Comment.create(content) 
     self.comments << @new_comment 
    end 
end 

Und es scheint zu funktionieren. Ich habe es nie wirklich in Frage gestellt oder habe mich gefragt, wann es "Speichern" (ich glaube, ich hatte nie ein starkes Verständnis davon, wann ich "Speichern" zu beginnen) hatte.

Allerdings scheint es, dass die after_save Haken auf Kommentare nicht in meiner add_comment Funktion aktiviert werden, die mich zu fragen, fordern:

Wie funktioniert die << Operator Arbeit in Activerecord und wo kann ich mehr darüber lesen ?

Dank

Antwort

12

Wenn Sie den shovel Operator (<<), Rails speichert automatisch das zugehörige Objekt. Also, wenn Sie dies tun:

self.comments << @new_comment 

@new_comment wird hinzugefügt, um die comments Sammlung und feuert sofort Update SQL für die auf das übergeordnete Objekt speichern oder aktualisieren Anruf, ohne zu warten, es sei denn, das übergeordnete Objekt ein neuer Datensatz ist.

Von this documentation

Sammlung < < (Objekt, ...) Fügt ein oder mehrere Objekte in die Sammlung von Schaffung Verbände in der Join-Tabelle (collection.push und collection.concat sind Aliase diese Methode). Beachten Sie, dass diese Operation sofort Update SQL auslöst, ohne auf den Aktualisierungsaufruf save oder für das übergeordnete Objekt zu warten, es sei denn, das übergeordnete Objekt ist ein neuer Datensatz.

+4

Oh, ich sehe, ich hatte Mühe, eine Menge der Suche nach „<<“ - schön zu wissen, dass es dem „Schaufel“ Operator genannt :) – cozos

+1

tatsächlich speichert es den geschoben Rekord nur wenn das "Eltern" -Element "Getreu" entspricht? Wenn Sie "<<" in einem new_record aufrufen, wird die Datenbank nicht gespeichert. – sekmo

0

Sammlung < < (object, ...)

Fügt ein oder mehrere Objekte in die Sammlung von Verbänden in der Join-Tabelle (collection.push und collection.concat sind Aliase dieses Verfahren die Schaffung) oder indem Sie ihre Fremdschlüssel auf den Primärschlüssel der Sammlung setzen. Beachten Sie, dass diese Operation sofort das Update SQL auslöst, ohne auf den Speicher- oder Aktualisierungsaufruf für das übergeordnete Objekt zu warten, es sei denn, das übergeordnete Objekt ist ein neuer Datensatz.

Beispiel:

class Group < ActiveRecord::Base 
    has_many :users 
    has_many :avatars, through: :users 
end 

class User < ActiveRecord::Base 
    belongs_to :group 
    has_one :avatar 
end 

class Avatar < ActiveRecord::Base 
    belongs_to :user 
end 

@group.avatars << Avatar.new # this would work if User belonged_to Avatar rather than the other way around