Rails - 使用ActiveRecord :: Enum时的ArgumentError

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails - 使用ActiveRecord :: Enum时的ArgumentError相关的知识,希望对你有一定的参考价值。

我创建了一个带有整数列Tester的模型tester_type,并在模型中声明了枚举变量。

class Tester < ApplicationRecord
  enum tester_type: { junior: 0, senior: 1, group: 2 }
end

在尝试为该模型创建/初始化对象时,我遇到了以下错误:

ArgumentError:您试图在模型“Tester”上定义名为“tester_type”的枚举,但这将生成一个类方法“group”,它已由Active Record定义。

所以,我尝试将tester_type更改为type_of_tester,但它会抛出相同的错误:

ArgumentError:您试图在模型“Tester”上定义名为“type_of_tester”的枚举,但这将生成一个类方法“group”,它已由Active Record定义。

我已经搜索了解决方案,我发现这个错误是ENUM_CONFLICT_MESSAGE类中的常量ActiveRecord::Enum但是,无法找到导致此问题的原因。

请帮我。

谢谢。

答案

在这种情况下,如果您想使用枚举,最好将标签重命名为其他内容。这不是枚举所特有的 - 许多Active Record功能为您生成方法,通常没有办法选择退出这些生成的方法。

然后将group改为another_name

或者你也应该遵循这个

enum :kind, [:junior, :senior, :group], prefix: :kind
band.kind_group?
另一答案

看一下这个。它是您遇到问题的选项组。您可以使用本文中提到的前缀选项

enum options

另一答案

当您需要定义具有相同值的多个枚举或在您的情况下,您可以使用:_prefix:_suffix选项,以避免与已定义的方法冲突。如果传递的值是true,则方法的前缀/后缀为枚举的名称。也可以提供自定义值:

class Conversation < ActiveRecord::Base
  enum status: [:active, :archived], _suffix: true
  enum comments_status: [:active, :inactive], _prefix: :comments
end

在上面的例子中,bang和谓词方法以及相关的范围现在都是相应的前缀和/或后缀:

conversation.active_status!
conversation.archived_status? # => false

conversation.comments_inactive!
conversation.comments_active? # => false

对于你的情况,我的建议是使用类似的东西:

class Tester < ApplicationRecord
  enum tester_type: { junior: 0, senior: 1, group: 2 }, _prefix: :type
end

然后您可以将这些范围用作:

tester.type_group!
tester.type_group? # => true

Tester.type_group # SELECT "testers".* FROM "testers" WHERE "testers"."tester_type" = $1  [["tester_type", 2]]
# or,
Tester.where(tester_type: :group) # SELECT "testers".* FROM "testers" WHERE "testers"."tester_type" = $1  [["tester_type", 2]]

以上是关于Rails - 使用ActiveRecord :: Enum时的ArgumentError的主要内容,如果未能解决你的问题,请参考以下文章

为此使用啥 Rails-ActiveRecord 关联?

Rails使用ActiveRecord Collection或Array更新,导致ActiveRecord :: RecordInvalid错误

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

Rails 3 包括翻译 globalize3 activerecord

使用 Rails 6 ActiveRecord 进行完全外连接

使用ActiveRecord的查询:: QueryMethods并返回ActiveRecord_Relation rails