2

我正在寻找一些关于使用顶级路由的理念和技术实践的反馈,这在 Rails 中不是包罗万象的。

例子:

# routes.rb
get '/cities' => 'cities#index'
get '/:city_id' => 'cities#show', as: :city, city_id:/([a-z\-\d]+)/

我有大约 30k 个城市:city_id 应该仅限于匹配“/los-angeles”之类的内容,而不是“/somewrongthing.jpg”。由于这是最后一条路线,因此它已成为一个包罗万象的路线。如果找不到城市,我目前正在渲染 404,但这意味着每次丢失的链接通过时都会对数据库造成打击。我通过约束对其进行了限制,但它并不是我所希望的优雅解决方案。

除了将其放在 /city/:city_id 之类的下方之外,还有其他解决方案吗?

4

1 回答 1

3

我认为您应该在路线本身中寻找一些替代方法来处理此问题。30,000 条路线只会将 RAM 问题换成 DB 问题。也许您有一些普通的 ruby​​ 对象(可能是文件支持的?),它可以充当城市缓存,并且您可以在每个到达您的城市路线的请求上查询它。

像这样的东西,也许?

# in config/routes.rb
get '/:city' => 'cities#show', constraints: CityConstraint.new

# in lib/city_constraint.rb
class CityConstraint
  def matches?(request)
    city_valid?(request.params[:city])
  end

  private

  def city_valid?(city)
    # I dunno.. Redis, look it up in a text file, hash, etc.
    # ..look it up in activerecord and cache it at startup?
    # or whatever...
  end
end
于 2012-07-31T21:22:08.860 回答