【问题标题】:Rails 5.2 - ArgumentError when trying to define enumRails 5.2 - 尝试定义枚举时出现 ArgumentError
【发布时间】:2019-12-11 11:51:03
【问题描述】:

我的班级用值enum source: [:pdf, :zip] 定义了一个枚举。每次我启动我的 Rails 应用程序时,都会出现以下错误:

ArgumentError: You tried to define an enum named "source" on the model "ExtractionRule", 
but this will generate a class method "zip", which is already defined by ActiveRecord::Relation.

在更新到 5.2.4 之前,这个没有问题。 ActiveRecord 库中是否有任何更新阻止创建具有值:zipenum

发行说明中没有其他说明。我已经查看了 Rails 源代码,但找不到任何会导致此问题的内容。

注意:将值的名称更改为 [:pdf_type, :zip_type] 之类的其他名称可以解决问题,但我宁愿保留代码,因为这在过去是有效的。

更新 我已经通过使用prefix: :source 设法解决了这个问题。这样我可以为 enum 保持相同的值。无论哪种方式,我都不知道为什么会发生错误。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord enums ruby-on-rails-5


    【解决方案1】:

    有问题的方法实际上是Enumerable#zip,它是Ruby标准库的一部分:

    irb(main):049:0> ['a','b', 'c'].zip([1,2,3])
    => [["a", 1], ["b", 2], ["c", 3]]
    

    将数组合并在一起。 ActiveRecord::Relation 包含 Enumerable,这使它像数组一样工作。

    在更新到 5.2.4 之前,这个没有问题。有没有 ActiveRecord 库上的任何更新都会阻止使用 值:zip?

    在更新之前你有一个古老的 Ruby 版本吗?如前所述,此方法是 Ruby 的一部分,而不是 AR。这实际上是一个完全不相关的问题 - 定义与 enumerable 冲突的类方法不是一个好主意,因为您迟早会与依赖于 #zip 实际压缩数组的代码进行交互。

    【讨论】:

    • ruby 版本从 2.4.5 更新到 2.5.5。哦,所以#zip 属于Enumerable。我注意到Enumerable 包含在ActiveRecord::Relation 中,但我没有加入这些点。谢谢@max 的澄清
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2018-07-08
    相关资源
    最近更新 更多