2017-08-30 66 views
0

我一直在使用Enum.reduce增加日期

Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc -> 

end) 

我会在每个减速器传递方法

CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip}, done_at) 

在done_at,默认值是Ecto.DateTime.utc,但我想在每个Enum.reduce上增加这个日期和时间。

我试图在Enum.reduce的最开始处声明datetime为done_at = Ecto.DateTime.utc,但是我不知道如何在Enum.reduce中循环它,以便我可以增加几秒钟进入它。这只会改变每次迭代的活动时间。任何帮助将不胜感激感谢

更新Dogbert

Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc -> 
    with {:found_user, sharee} <- ensure_user(email) 
    do 
    case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do 
     {:ok, camera_share} -> 
     unless caller == sharee do 
      send_email_notification(caller, camera, sharee.email, camera_share.message) 
     end 
     Camera.invalidate_user(sharee) 
     Camera.invalidate_camera(camera) 
     CameraActivity.log_activity(caller, camera, "shared", %{with: sharee.email, ip: requester_ip}) 
     {[camera_share | shares], share_requests, changes} 
     {:error, changeset} -> 
     {shares, share_requests, [attach_email_to_message(changeset, email) | changes]} 
    end 
    else 
    {:not_found, email} -> 
     case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do 
     {:ok, camera_share_request} -> 
      send_email_notification(caller, camera, email, camera_share_request.message, camera_share_request.key) 
      CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip}) 
      Intercom.intercom_activity(Application.get_env(:evercam_media, :create_intercom_user), get_user_model(email), get_user_agent(conn), requester_ip, "Shared-Non-Registered") 
      {shares, [camera_share_request | share_requests], changes} 
     {:error, changeset} -> 
      {shares, share_requests, [attach_email_to_message(changeset, email) | changes]} 
     end 
    end 
end) 
+0

你为什么不保存'done_at'的电流值在累加器以及在每次迭代增量呢? – Dogbert

+0

我只担心增量。怎么做? –

+0

也不知道如何将它保存在累加器中,实际上累加器也是从您以前的问题中学习到的 –

回答

1

你已经有3元组作为Enum.reduce/3呼叫累加器。您可以将日期时间值添加为元组中的第4项,并在每次迭代中增加它。例如,通过5秒增加它,你可以这样做:

Enum.reduce(email_array, {[], [], [], Ecto.DateTime.utc}, fn email, {shares, share_requests, changes, datetime} = _acc -> 
    # next_datetime is datetime + 5 seconds 
    next_datetime = datetime |> 
    Ecto.DateTime.to_erl |> 
    :calendar.datetime_to_gregorian_seconds |> 
    Kernel.+(5) |> 
    :calendar.gregorian_seconds_to_datetime |> 
    Ecto.DateTime.from_erl 

    # `next_datetime` should be returned as the 4th value of each tuple below. 
    # `datetime` can be used as the current value. 

    with {:found_user, sharee} <- ensure_user(email) 
    do 
    case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do 
     {:ok, camera_share} -> 
     ... 
     {[camera_share | shares], share_requests, changes, next_datetime} 
     {:error, changeset} -> 
     {shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime} 
    end 
    else 
    {:not_found, email} -> 
     case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do 
     {:ok, camera_share_request} -> 
      ... 
      {shares, [camera_share_request | share_requests], changes, next_datetime} 
     {:error, changeset} -> 
      {shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime} 
     end 
    end 
end)