我正在rails上建立一个度假村评论网站。目前,aUser有很多评论,每个Review都属于aUser
reviews表包含一个expedia_id字段。所有数据-酒店名称、图像、描述等都是使用此ID的查找从Expedia API中动态提取的。例如,当在控制器中点击show操作时,它会使用expedia_id请求Expedia和My DB获取所有评论和内容,将所有内容呈现在一页上。还将请求填充主页(我正在考虑一个带有Featured列的expedia_id表)
由于我的整个网站严重依赖于一个api,而且我没有一个Resort表,再加上给定大量用户,会对expedia api提出很多请求,所以将结果刮写到我的数据库中,创建记录以供以后使用是否有意义?

最佳答案

中间立场是最好的解决办法。
创建一个表和模型来本地存储活动的度假村。在一段时间后过期本地副本(取决于Expedia上度假村更改的频率),并且仅在系统度假村的新项目上ping API,或加载已过期的度假村
这是一个基本的例子

class Resort < ApplicationRecord #for Rails <=4 do ActiveRecord::Base
  after_find :maybe_update_from_expedia
  ExpirationTime = 1.day #change to fit what is needed

  def self.find_by_expedia_id(expedia_id)
    result = self.where(expedia_id: expedia_id).first
    result || self.create_by_expedia_id(expedia_id)
  end

  def maybe_update_from_expedia
    update_from_expedia if expire_at.nil? || expire_at < Time.now
  end

  private
  def self.create_by_expedia_id(expedia_id)
    record = new(expedia_id: expedia_id)
    record.maybe_update_from_expedia
    record
  end

  def update_from_expedia
    #fetch record from expedia
    #update local data
    self.expire_time = Time.now + ExpirationTime
    self.save
  end
end

根据engineersmnky的建议,这可以浓缩为
class Resort < ApplicationRecord #for Rails <=4 do ActiveRecord::Base
  after_initialize :maybe_update_from_expedia
  ExpirationTime = 1.day #change to fit what is needed

  private

  def maybe_update_from_expedia
    update_from_expedia if expire_at.nil? || expire_at < Time.now
  end

  def update_from_expedia
    #fetch record from expedia
    #update local data
    self.expire_time = Time.now + ExpirationTime
    self.save
  end
end

如果所有提取请求都使用Resort.find_or_create_by(expedia_id: expedia_id)

10-01 07:13
查看更多