为什么定义?(ModelName)返回nil?

时间:2013-11-22 00:47:15

标签: ruby-on-rails activerecord defined

我在开发模式下运行了一个rails控制台,并测试了是否定义了模型。结果令人惊讶。

> defined?(User)
nil
> defined?(Object)
"constant"
> User
User(id: integer, email: string, encrypted_password: string, created_at: datetime, updated_at: datetime)
> defined?(User)
"constant"

在我直接引用User模型之前,它似乎没有被加载。我假设这与自动加载功能有关,因此代码的实时更改会反映在应用程序中,而无需重新启动服务器。但是,这不是检查模型现有的理想选择。

我检查模型存在的原因是为了在新列的迁移中执行一些属性填充。我只想在模型存在的情况下执行填充,因为在将来的某个时刻,模型可能不存在,并且在迁移文件运行后更改迁移文件并不是一种好的做法。

有解决方法吗?

2 个答案:

答案 0 :(得分:1)

if (Foo rescue false)
  ...
end

答案 1 :(得分:0)

这个SO答案将有助于解决您的问题:How to check if a class already exists in Ruby

也就是说,您可以考虑在迁移之外进行属性填充。例如,在部署后可以运行的rake任务中。我发现以这种方式将数据库模式迁移与数据迁移分开会带来很多麻烦。