【发布时间】: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