【发布时间】:2012-09-25 13:30:57
【问题描述】:
我正在使用 Ruby on Rails 3.2.2,我想检查数据库表列的存在和数据类型(例如:String、@ 987654324@, ...) 给定模型类的该列。也就是说,我在 lib 目录中实现了一个 Ruby 模块,并使用一个将模型类传递给它的方法(例如:Article),我想验证某些相关数据库表列的一些条件,仅此而已。
在我的模块方法中,我尝试使用column_exists? 方法,如下所示
module MyModule
def check_column(model_class)
table = model_class.to_s.tableize
unless ActiveRecord::Base.connection.column_exists?(table.to_sym, :title)
raise ...
end
end
end
但没有成功:与column_exists? 方法相关的(奇怪的)输出错误是这样的
Mysql2::Error: Table '<MY_APP_NAME>_development.<A_TABLE_NAME>/<ANOTHER_TABLE_NAME>/<ANOTHER_TABLE_NAME>' doesn't exist: SHOW FULL FIELDS FROM `<A_TABLE_NAME>/<ANOTHER_TABLE_NAME>/<ANOTHER_TABLE_NAME>`
如何在运行时正确检查数据库表列的存在和数据类型?
【问题讨论】:
-
您希望您的数据库在您的应用程序下发生变化吗?数据库应该是静态的,并且它的表、字段和字段类型是通过迁移或因为它是遗留的而预先确定的。为什么不提前知道字段是什么类型?任何 ORM 都必须知道表名、字段名和类型才能正常工作。 ActiveRecord 和 Sequel 在连接后都会检查模式,所以这是询问它们的情况。 Sequel 可以很容易地找到这些东西,所以我相信 ActiveRecord 也可以。但问题仍然存在,为什么需要检查?
-
@the Tin Man - (1) 你:“你希望你的数据库在你的应用程序下面发生变化吗?”。 我:不,我没有。 (2) 你:“[...]你为什么需要检查?”。 我:我在问题中写道:“我想验证某些相关数据库表列的一些条件,仅此而已”。
-
在您的应用程序启动之前,您应该了解有关数据库的所有信息,因此,即使不查询它,您也知道数据类型、字段宽度、字段名称等。您不需要检查任何内容。如果这样做,则数据验证或系统设计有问题。
-
@the Tin Man - 你是对的,但根据我的需要,当应用程序以开发者模式启动时,会检查数据库表列。
标签: ruby-on-rails ruby database ruby-on-rails-3