所以我最近通过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
我今天发现在上面的table_exists?
方法中需要initialize
,因为每次运行rake任务时都会引发我的路由 - ,例如设置开发数据库。如果数据库尚不存在,并且根本没有加载应用程序,则pluck
调用会引发错误,因为该表尚不存在。
虽然调用table_exists?
可能并不昂贵,但我很担心它会在生产中为每个请求调用,当应用程序启动后表格不可能存在。这让我想知道开始时是不是一个坏主意,使用Active Record表中的数据来创建路由约束。
我确实希望我的路由受限于这些值,并且值可以根据站点内容管理而改变(因此对它们进行硬编码很愚蠢)。我希望用户在使用无效的类别名称时获取404,而不是正常加载我的网站并说“抱歉没有类别的项目 XYZ ”。因此,我坚持需要这个table_exists?
调用的问题,初始prod部署,第一次为新开发人员设置和环境,以及任何人为网站删除和设置新数据库。
这看起来像是一种不好的做法吗?如果我希望应用程序在数据库未设置时按预期运行,这只是我必须要忍受的东西吗?
有谁知道更好的选择吗?
答案 0 :(得分:0)
我的申请中有这个约束:
scope '/:slug', constraints: lambda { |request| Class.find_by_slug(request.params[:slug]).present? } do
在这个范围内我有一个route globbing,所以除了使用这个约束之外我什么也做不了,因为slugs是用户创建的动态资源。
我认为这是解决问题的工具,所以如果它是您知识的最佳选择,请使用它!
通过这一切,我了解您的应用程序需要一个数据库,那么您如何在没有数据库的情况下期望您的应用程序正常运行?