Ruby on rails 根据年份变量选择模型

Ruby on rails 根据年份变量选择模型,ruby-on-rails,Ruby On Rails,我正在Rails中为一个内部项目构建一个新的应用程序,该项目每年都会根据我们客户的需求进行轻微的更改。年与年之间的任何变化都将发生在模型中添加/删除列、格式、报告等。我的计划是根据今年的要求进行构建,并在今后每年创建一个新模型和迁移,例如Sample2019Record、Sample2020Record,将封装当年的要求。该应用程序还需要呈现上一年的数据,所有数据的范围都基于年份,这意味着不需要呈现或查询多年数据。我不希望每年都创建一个新的应用程序,因为这需要维护更多的应用程序 因此,我的想法是

我正在Rails中为一个内部项目构建一个新的应用程序,该项目每年都会根据我们客户的需求进行轻微的更改。年与年之间的任何变化都将发生在模型中添加/删除列、格式、报告等。我的计划是根据今年的要求进行构建,并在今后每年创建一个新模型和迁移,例如Sample2019Record、Sample2020Record,将封装当年的要求。该应用程序还需要呈现上一年的数据,所有数据的范围都基于年份,这意味着不需要呈现或查询多年数据。我不希望每年都创建一个新的应用程序,因为这需要维护更多的应用程序

因此,我的想法是将年份包括在URL/2018/sample/new或/sample/new?year=2018中,并根据年份样本{year}记录解析模型。rails能否安全地处理这一问题?是否有一个Gem可以帮助实现这一方法

这是我的想法,谢谢你的建议

routes.rb

路线将始终默认为当前年份

应用程序\u controller.rb

添加了一个before_操作来检查year参数,并添加了get_sample_record方法来安全地稳定记录,该记录可以从任何具有可选年份的控制器调用,如下所示:

示例_controller.rb


如果通过了无效年份,结果将为零,因此我将在控制器中处理检查

正如@DaveNewton所说,只要您在不同的表格中保存对应于不同年份要求的数据,这似乎应该可以正常工作。其他一些意见:

Rails有一个助手方法constantize,用于从字符串解析模型:

klass_name = "Sample#{year}Record"
record = klass_name.constantize.new()
将使变量记录成为与年份变量相对应的类的实例。您可能会发现使用工厂模式封装流程很有帮助

还有。请注意如何命名和组织文件。对于名称中带有数字的类,使用Rails感染程序时可能会有所帮助。使用Rails的很大一部分是让它的魔力为您所用,而不是无意中试图与之对抗

作为一条一般性的建议,而不是Rails特有的建议,我还将对如何为将持续多年的记录定义公共接口进行大量思考。具有以下特性的代码库

if record.instance_of? Sample2018Record
  record.my_2018_method
elsif record.instance_of? Sample2019Record
  record.my_method_only_relevant_to_2019
...

这将变得很难解释,特别是对于几年后加入的开发者来说。Ruby有非常强大的工具来帮助您非常有效地使用duck type。

Rails可以处理任何您可以编写的代码。我对创建全新的类很谨慎,但是如果没有太多的上下文,很难知道什么方向最有意义。Ruby/Rails能处理这个问题吗?当然可以,但是如果您将数据保存在同一个表中,那么很可能会出现问题。谢谢您的快速回复!我的计划是每年保留单独的模型和迁移。我目前正计划将模型名称与年份连接起来,并使模型与以下内容类似:。我对Rails非常陌生,找不到任何支持这种方法的gem或帮助,我想知道是否有更好的方法来实现这一点。代码本身应该相对简单。当您与单个表和多个模型交互时,可能会出现问题。如果是分开的桌子,那就没有问题了,只是有点怪。没有什么东西是前置过滤器不容易处理的。
sample_2018_record = get_sample_record
sample_2018_record.count
#> 304
sample_2017_record = get_sample_record 2017
sample_2017_record.count
#> 575683
klass_name = "Sample#{year}Record"
record = klass_name.constantize.new()
if record.instance_of? Sample2018Record
  record.my_2018_method
elsif record.instance_of? Sample2019Record
  record.my_method_only_relevant_to_2019
...