6

J'ai le code dans mon application qui ajoute une relation has_many avec l'opérateur "< <" comme ceci:Rails ActiveRecord Pelle (<<) Opérateur

class BlogPost < ActiveRecord::Base  
    has_many :comments 

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

Et il semble fonctionner. Je ne l'ai jamais vraiment questionné ou je me demandais quand il appelle "sauver" (je suppose que je n'ai jamais eu une forte compréhension de quand appeler "enregistrer" pour commencer).

Cependant, il semble que le after_save crochet commentaires ne soit pas activé dans ma fonction add_comment, ce qui me pousse à demander:

Comment fonctionne l'opérateur << dans activerecord et où je peux en lire davantage ?

Merci

Répondre

12

Lorsque vous utilisez l'opérateur shovel (<<), Rails enregistre automatiquement l'objet associé. Alors, quand vous faites ceci:

self.comments << @new_comment 

@new_comment est ajouté à la collection comments et les incendies instantanément mise à jour SQL sans attendre l'appel d'enregistrer ou mise à jour sur l'objet parent, à moins que l'objet parent est un nouveau record.

De this documentation

collection < < (objet, ...) Ajoute un ou plusieurs objets à la collection en créant des associations dans la table de jointure (collection.push et collection.concat sont des alias pour cette méthode). Notez que cette opération déclenche instantanément la mise à jour SQL sans attendre l'enregistrement ou l'appel de mise à jour sur l'objet parent, sauf si l'objet parent est un nouvel enregistrement .

+4

Oh je vois, j'ai eu beaucoup de mal à la recherche de « << » - bon de savoir qu'il est appelé l'opérateur « Pelle » :) – cozos

+1

réellement enregistre le disque poussé seulement si l'élément "parent" répond vrai à "persisté?". Si vous appelez "<<" sur un new_record, il ne sauvegarde pas sur la base de données. – sekmo

0

collection < < (objet, ...)

Ajoute un ou plusieurs objets à la collection en créant des associations dans la table de jointure (collection.push et collection.concat sont des alias pour cette méthode) ou en affectant leurs clés étrangères à la clé primaire de la collection. Notez que cette opération déclenche instantanément la mise à jour SQL sans attendre l'appel save ou update sur l'objet parent, sauf si l'objet parent est un nouvel enregistrement.

Exemple:

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