刮掉整个API还是严重依赖它?

myc*_*ius 2 ruby api-design ruby-on-rails web-scraping

我正在用Rails构建一个度假胜地审查站点。目前,User有多个评论,每个评论都Review属于User

评论表包含一个expedia_id字段。所有数据(酒店名称,图像,描述等)均通过针对此ID的查找从Expedia API中动态提取。例如,当show在控制器中执行操作时,它使用来向Expedia 我的数据库发出请求expedia_id以获取所有评论和内容,并将所有内容呈现在一页上。也将请求填充主页(我在考虑Featured带有expedia_id列的表)

由于我的整个网站都高度依赖API,而且我没有Resort表格,再加上大量用户,因此会对Expedia API提出许多要求,因此抓取并编写结果到我的数据库中,创建记录以备后用?

Mic*_*man 5

中间立场将是最好的解决方案。创建一个表和模型以本地存储活动度假村。在一定时间后到期的本地副本(取决于度假村在Expedia上的更改频率),并且仅将api ping到新的系统度假村中,或加载已过期的度假村

这将是如何完成此操作的基本示例

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
Run Code Online (Sandbox Code Playgroud)

正如工程师 mnky 所建议的那样,可以将其浓缩为

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
Run Code Online (Sandbox Code Playgroud)

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