【发布时间】:2014-09-08 23:22:00
【问题描述】:
我最近开始研究 Ruby on Rails,并建立了一个基本系统来扫描解析和 XML 数据源,将元素存储在 MySQL 数据库中。
我打算以设定的时间间隔将脚本作为 rake 任务运行以检测数据更改,我正在扫描来自多个区域的数据,并且目前设置了两个数据库表,Product 和 Product Info。
Product 存储跨所有区域的持久性数据,名称和价格等非持久性数据与区域区域设置一起存储在ProductInfo 表中。
为了检测更改,我在 ProductInfoController 中定义了 touch: true,以确保在 XML 数据解析期间更改 ProductInfo 时更改 Product 的 updated_at 列。
为了更新值,我使用find_or_initialize_by 捕获任何现有记录,然后调用update,从XML 数据源中传入所有 属性。如果没有任何属性更改,则记录的updated_at 列在ProductInfo 表中不会更改,但在Product 表中仍会更改。
product = Product.find_or_initialize_by(guid: xml.guid)
product.update(category: xml.category)
product_info = ProductInfo.find_or_initialize_by(product_id: product.id, locale: xml.locale)
product_info.update(name: xml.name, price: xml.price)
所以问题是,每当在模型上调用 save 时都会调用 touch,这发生在 update 调用中。是否有我可以使用的替代调用,或者设置这些属性的更好方法?或者,有没有更好的方法来增量更新属性?
【问题讨论】:
-
检查这个 - api.rubyonrails.org/classes/ActiveModel/Dirty.html 在这里你可以检查是否有任何值发生了变化,然后只触发更新查询
标签: ruby-on-rails ruby ruby-on-rails-4