【问题标题】:Rails Active Record / Database Data in a Route Constraint路由约束中的 Rails 活动记录/数据库数据
【发布时间】:2016-04-12 12:06:48
【问题描述】:

所以我最近通过adding some Constraint classes 整理了我的 Rails 应用程序中的许多路线限制。大多数情况下,这已经很好地模块化、干燥且易于理解,因此我可能会在未来的开发中坚持这种模式。

我想知道从 Constraint 类中查询 Active Record 数据是否是一种“不好的做法”。例如,考虑以下类:

class CategoryConstraint
  include DisplayConstraintHelper

  def initialize
    @names = Category.table_exists? ? Category.pluck(:name) : []
  end

  def matches?(request)    
    @names.include?(request.path_parameters[:category]) && display_matches?(request)
  end
end

我今天发现我在上面的initialize 方法中需要table_exists?,因为每次我运行 rake 任务时都会调用我的路由 - 例如设置开发数据库。如果数据库尚不存在,并且应用程序已完全加载,则在调用 pluck 时会引发错误,因为该表尚不存在。

虽然调用table_exists? 可能并不昂贵,但我很担心它会在生产环境中为每个请求调用,因为在应用程序启动后该表不可能不存在。这让我开始怀疑使用 Active Record 表中的数据创建路由约束是否是一个坏主意。

不过,我确实希望我的路线限制为这些值,并且这些值可以根据站点内容管理而改变(因此硬编码它们很愚蠢)。我希望用户在使用无效的类别名称时得到 404,而不是我的网站正常加载并说“抱歉没有类别 XYZ 的项目”。因此,我遇到了需要此table_exists? 调用的问题,用于初始产品部署、新开发人员首次设置和环境,以及任何人为站点删除和设置新数据库。

这似乎是一种不好的做法?如果我希望应用程序在数据库未设置时按预期运行,这仅仅是我必须忍受的事情吗?

有人知道更好的选择吗?

【问题讨论】:

  • 几年后我返回了这个,并且强烈建议不要在路由约束中这样做。我希望在关联路由的操作中处理这个问题,并且在生成路由时没有数据库查询/连接!

标签: ruby-on-rails ruby-on-rails-4 activerecord routing constraints


【解决方案1】:

我的应用程序中有这个限制:

scope '/:slug', constraints: lambda { |request| Class.find_by_slug(request.params[:slug]).present? } do

在这个范围内我有一个route globbing,所以我只能使用这个约束,因为 slug 是用户创建的动态资源。

我认为这是解决问题的工具,所以如果它是你所知道的更好的选择,那就使用它吧!

从这一切中,我了解到您的应用程序需要一个数据库,那么您怎么能期望您的应用程序在没有数据库的情况下正常工作呢?

【讨论】:

  • 感谢您的回答,您确实提出了很好的问题,但他们没有解决我提出的问题:无法使用上述代码启动应用程序,并且无法设置数据库或重新加载架构。您的代码本质上是我的约束类的单行代码,并且存在相同的问题:当应用程序在数据库初始化之前加载路由时调用 find_by_slug 将失败(除非您还添加与我相同的解决方案:table_exists? 条件) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多