Rails路由顶级路由和信息架构

时间:2012-07-31 21:11:35

标签: ruby-on-rails ruby-on-rails-3 routing

我正在寻找关于使用顶级路线的理念和技术实践的一些反馈,这些路线在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这样的东西之外还有什么解决方案吗?

1 个答案:

答案 0 :(得分:3)

我认为您应该考虑在路线本身处理此问题的替代方案。 30,000条路线只会交换数据库问题的RAM问题。 也许你有一些普通的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