Rails中名为“Type”的模型

时间:2014-06-22 15:14:32

标签: ruby-on-rails ruby

美好的一天。

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

undefined method `all' for ActiveRecord::AttributeMethods::Serialization::Type:Class

在验证的这个特定部分:

validates :type_id, presence: { message: 'selected is invalid' }, inclusion: { in: 1..Type.all.count }

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

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

PS。

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

3 个答案:

答案 0 :(得分:3)

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

Rails建立在convention over configuration协议之上,所以我建议只选择另一个模型名称(在博文中没有提及)。

查看this thread,了解如何将Type模型转换为其他模式。

如果您完全确定型号名称不是这种情况,您可以尝试使用不同的验证表示法,例如

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

答案 1 :(得分:0)

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

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

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

validates_presence_of :type

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

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

答案 2 :(得分:0)

幸运的是,我找到了解决方法。但是,不推荐使用,但如果您不想进行迁移和吨的折射,这是我的解决方案(归功于twonegatives)。

在我的验证码中:

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

然后创建该方法

type_alias

def type_alias
  Type.all.count
end