美好的一天。
我的模型名为“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'时,没有发生错误。
答案 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