2009-07-15 4 views
1

Je voudrais des conseils sur la façon dont je devrais synchroniser une liste d'adresses e-mail sur les utilisateurs 11k par rapport à un programme de liste de diffusion externe, dans ce cas Mailchimp.Quelle est la manière la plus efficace de synchroniser une base de données utilisateur avec un service de liste de diffusion externe?

Normalement, la façon dont je ferais cela est simplement d'avoir un callback: after_save, pour envoyer une seule mise à jour à l'API externe.

Mais déjà chaque heure, une tâche rake est exécutée pour mettre à jour une propriété sur chaque utilisateur dans la base de données. Si je le faisais simplement, toutes les heures, l'API mailchimp pauvre serait frappée 11 000 fois.

Quel est le moyen le plus efficace et le plus simple de le faire, de vérifier seulement si un seul attribut que vous regardez a changé par rapport à ce qu'il était avant la sauvegarde?

S'il y a une variable qui persiste tout au long du cycle de vie de la transaction, je ferais simplement quelque chose comme ceci, où je vérifie si la valeur a changé, et si elle est différente, exécute un autre code.

class User 

    :before_save :store_old_email 

    :after_save :sync_with_chimp 


    def store_old_email 
    $ugly_of_global_variable_to_store_email = user.email 
    end 

    :sync_with_chimp 
    if $ugly_of_global_variable_to_store_email != user.email 
     //update_mail_chimp_api 
    end 
    end 

end 

J'ai vérifié les rails api ici, et je suis encore un peu clair sur la façon dont je devrais faire cela.

Voulez-vous utiliser la classe dirty? ici pour faire cela?

Répondre

1

C'est ainsi que je suis allé à la fin.

Il tourne sur Rails vous donne des charges de callbacks pratiques dans le sale pour le faire.

Toutes les suggestions sur la façon de rendre ce code moins répétitif seront reçues avec reconnaissance.

def update_mailchimp(optin) 
    # Create a Hominid object (A wrapper to the mailchimp api), and pass in a hash from the yaml file 
    # telling which mailing list id to update with subscribe/unsubscribe notifications) 
    @hominid = Hominid.new 
    client_site_list_id = YAML.load(File.read(RAILS_ROOT + "/config/mailchimp.yml")) 

    case optin 
    when 'subscribe_newsletter' 
     logger.debug("subscribing to newsletter...") 
     "success!" if @hominid.subscribe(client_site_list_id['client_site_to_mailchimp_API_link'], email, {:FNAME => first_name, :LNAME => last_name}, 'html') 
    when 'unsubscribe_newsletter' 
     logger.debug("unsubscribing from newsletter...") 
     "success!" if @hominid.subscribe(client_site_list_id['client_site_to_mailchimp_API_link'], email, {:FNAME => first_name, :LNAME => last_name}, 'html') 
    when 'subscribe_monthly_update' 
     logger.debug("subscribing to monthly update...") 
     "success!" if @hominid.subscribe(client_site_list_id['monthly_update'], email, {:FNAME => first_name, :LNAME => last_name}, 'html') 
    when 'unsubscribe_monthly_update' 
     logger.debug("unsubscribing from monthly update...") 
     "success!" if @hominid.unsubscribe(client_site_list_id['monthly_update'], email, {:FNAME => first_name, :LNAME => last_name}, 'html') 
    end 
end 

# Keep the users in sync with mailchimp's own records - by only firing requests to the API if details on a user have changed after saving. 

def check_against_mailchimp 
    logger.info("Checking if changes need to be sent to mailchimp...") 
    if newsletter_changed? 
    logger.info("Newsletter changed...") 
    newsletter ? update_mailchimp('subscribe_newsletter') : update_mailchimp('unsubscribe_newsletter') 
    end 
    if monthly_update_changed? 
    logger.info("update preferences changed...") 
    monthly_update ? update_mailchimp('subscribe_monthly_update') : update_mailchimp('unsubscribe_monthly_update') 
    end 
end 
0

vous pouvez changer vos utilisateurs modèle à une ressource active au lieu d'enregistrement actif et il suffit d'utiliser mailchimps api comme db pour les utilisateurs

c'est un poste plus au sujet de ressource active mais peut vous aider à démarrer sur le bon chemin

http://www.therailsway.com/2007/9/3/using-activeresource-to-consume-web-services

+0

C'est une approche intelligente! ce n'est pas celui que j'ai utilisé, car ce n'était pas la meilleure solution pour la logique sur le serveur, mais cela vaut la peine de se souvenir - merci pour le lien. –

Questions connexes