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

时间:2017-06-14 19:03:00

标签: ruby-on-rails ruby web-scraping api-design

我正在铁路建立度假村评论网站。目前,User有很多评论,每个Review都属于User

评论表包含expedia_id字段。所有数据 - 酒店名称,图像,描述等都是使用针对此ID的查找从Expedia API动态提取的。例如,当点击控制器中的show操作时,它会使用expedia_id向Expedia 我的数据库发出请求以获取所有评论和内容,并呈现一页上的一切。还会请求填充主页(我正在考虑使用Featured列的expedia_id表格)

由于我的整个网站在很大程度上依赖于API,而且我没有Resort表格,加上给予大量用户的事实,很多的请求将对Expedia API进行修改,将结果写入我的数据库并创建记录供以后使用是否有意义?

1 个答案:

答案 0 :(得分:5)

中间地带将是最好的解决方案。 创建一个本地存储活动度假村的表和模型。在一段时间后确定您的本地副本(根据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)