Какой самый эффективный способ синхронизации базы данных пользователей со службой внешнего списка рассылки? - PullRequest
1 голос
/ 15 июля 2009

Мне хотелось бы получить несколько советов о том, как синхронизировать список адресов электронной почты для пользователей 11k с программой внешнего списка рассылки, в данном случае Mailchimp.

Как правило, я бы просто использовал обратный вызов: after_save для отправки одного обновления на внешний API.

Но уже каждый час запускается задача rake, чтобы обновить свойство для каждого пользователя в базе данных. Если бы я просто делал это, каждый час плохой API mailchimp получал бы 11 000 раз.

Какой самый эффективный и простой способ сделать это, чтобы проверить, изменился ли только один атрибут, который вы смотрите, по сравнению с тем, который был до сохранения?

Если есть переменная, которая сохраняется в течение жизненного цикла транзакции, я просто сделал бы что-то вроде этого, где я проверяю, изменилось ли значение, и если оно отличается, выполнить другой код.

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

Я проверил API рельсов здесь, и мне все еще немного неясно, как я должен это делать.

Вы бы использовали класс dirty? , чтобы сделать это?

Ответы [ 2 ]

1 голос
/ 21 июля 2009

Так я и сделал в конце.

Оказывается, Rails предоставляет вам множество удобных обратных вызовов для грязного использования.

Любые предложения о том, как сделать этот код менее повторяющимся, будут с благодарностью приняты.

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 голосов
/ 15 июля 2009

вы можете изменить модель пользователя на активный ресурс вместо активной записи и просто использовать mailchimps api в качестве базы данных для пользователей

Это более старый пост об активном ресурсе, но он может помочь вам начать правильный путь

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...