Rails中名为“Type”的模型

美好的一天。

我的模型名为“Type”有问题。 错误是:

 未定义的方法`all'用于ActiveRecord :: AttributeMethods :: Serialization :: Type:Class 

在validation的这个特定部分:

 validation:type_id,在线状态:{message:'selected is invalid'},包含:{in:1..Type.all.count} 

也许这是由于Rails中的保留名称冲突。 但在进行重构之前,Rails有没有办法考虑这个名字? (如果没别的事可做)。

这对于一个名字来说真的是一个糟糕的选择,但为时已晚。

PS。

当我在rails控制台中执行’Type.all.count’时,没有发生错误。

Ruby的常量查找导致它找到“错误的”Type类。 使用“:: Type”强制ruby使用顶级Type常量。

您应该注意,此计数仅执行一次:当rails实例启动时。 如果要添加新类型,则validation不会考虑这一点。 如果某个类型被删除,那么它将不允许使用最后一个类型。

如果您有type关联,那么您可以这样做

 validates_presence_of :type 

保存后,它会尝试从数据库中加载相应的Type对象,因此如果没有这样的行,保存将失败。

为了一个非常强大的保证,您可以使用外键约束(外国人gem为此添加帮助器到rails迁移,但您也可以手动编写sql语句)

这是Rails中保留字的列表。 如您所见,据报道type也会导致问题。

Rails是基于配置协议的约定构建的,所以我建议只选择另一个模型名称(在所述博客文章中没有提到)。

看看这个post ,了解如何将Type模型转换为其他模式。

如果您完全确定型号名称不是这种情况,您可以尝试使用不同的validation符号

inclusion: { in: 1.upto(Type.all.count).to_a}

幸运的是,我找到了一个解决方法。 但是,不建议这样做,但是如果你不想做迁移和吨的折射,这是我的解决方案(信用到twonegatives )。

在我的validation码中:

 inclusion: { in: 1.upto(:type_alias) } 

然后创建该方法

  type_alias 

 def type_alias Type.all.count end