ruby-on-rails - 仅提取自上次提取以来创建的记录的最有效方法是什么?
问题描述
我正在构建一个 Shopify 应用程序,我希望我的客户(店主)偶尔将应用程序与他们的商店数据“同步”,特别是针对他们的Order
数据(忽略我还将有一个网络钩子将这些数据推送到我的每当创建新订单时应用程序)。
现在,仅出于粗略说明的目的,我正在这样做(在开发模式下工作):
store_orders = ShopifyAPI::Order.find(:all)
store_orders.each do |sorder|
new_order = Order.find_or_create_by(s_order_id: sorder.id)
new_order.update(
currency: sorder.currency,
...
)
所以,我直接从ShopifyAPI
. 理想情况下,我希望只提取尚未同步的新订单。
我有两个限制:
Order IDs
生成的不是ShopifyAPI
按顺序排列的,而且可能比较随意- 我无法根据日期进行
where
查询,即只选择我上次同步日期之后的记录(目前不允许这样做,我不确定将来是否会修复)。ShopifyAPI
updated_at
ShopifyAPI
所以这给我留下了两个问题:
- 让我快速找到尚未拉出的记录并仅拉出那些记录的另一种有效方法是什么?
- 如何确保仅在本地更新任何属性已更改或之前不存在记录的记录?(即我试图避免更新已拉出的每条记录)。
解决方案
我不确定您在哪里认为 Shopify 订单 ID 是“随意的”而不是“顺序”的?如果你研究这些东西,你会发现它们是整数,实际上它们是有序的,因为一个在另一个之后创建的订单会有一个更大的 ID。
因此,您可以做的最酷的小事情,真的很简单,就是使用被称为“since_id”的 Shopify API 过滤器。假设您将上次提取的 ID 存储在您保留的商店模型上的 since_id 字段中,那么您可以仅提取自上次拉动以来命中 Shopify 的订单。
试试看。它完美地工作。我多年来一直这样做。处理完一批订单后,只需更新数据库中的 since_id,然后在下次需要更多订单时,使用您的 since_id 进行过滤。
推荐阅读
- oracle - 为什么当我运行这个程序时它要求我绑定变量?
- mongodb - MongoDB 拒绝连接
- javascript - 当我使用重定向时,为什么我的组件不会重新呈现?
- mysql - group_concat 在多个连接上工作不正确
- javascript - 当导航选项卡位于其中时,引导滚动模式不起作用
- r - 如何按组/子集进行 Leave One Out 交叉验证?
- java - 什么是 Java 中的“单代”垃圾收集器?
- python - ValueError:在 if 语句中对已关闭文件的 I/O 操作
- python - Django Elastic Search: Elastic returns nothing
- matplotlib - 如何保存由 matplot 生成的交互式绘图