我正在铁路建立度假村评论网站。目前,User
有很多评论,每个Review
都属于User
。
评论表包含expedia_id
字段。所有数据 - 酒店名称,图像,描述等都是使用针对此ID的查找从Expedia API动态提取的。例如,当点击控制器中的show
操作时,它会使用expedia_id
向Expedia 和我的数据库发出请求以获取所有评论和内容,并呈现一页上的一切。还会请求填充主页(我正在考虑使用Featured
列的expedia_id
表格)
由于我的整个网站在很大程度上依赖于API,而且我没有Resort
表格,加上给予大量用户的事实,很多的请求将对Expedia API进行修改,将结果写入我的数据库并创建记录供以后使用是否有意义?
答案 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)