Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在运行时检查数据库表列的存在和数据类型?_Ruby On Rails_Ruby_Database_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 如何在运行时检查数据库表列的存在和数据类型?

Ruby on rails 如何在运行时检查数据库表列的存在和数据类型?,ruby-on-rails,ruby,database,ruby-on-rails-3,Ruby On Rails,Ruby,Database,Ruby On Rails 3,我正在使用RubyonRails 3.2.2,我想检查数据库表列的存在情况以及给定模型类的该列的数据类型(例如:String,Integer,…)。也就是说,我正在lib目录中实现一个Ruby模块,该模块使用一个模型类(例如:Article)传递给它,我只想验证某些相关数据库表列的一些条件,仅此而已 在我的模块方法中,我尝试使用以下方法 module MyModule def check_column(model_class) table = model_class.to_s.tab

我正在使用RubyonRails 3.2.2,我想检查数据库表列的存在情况以及给定模型类的该列的数据类型(例如:
String
Integer
,…)。也就是说,我正在
lib
目录中实现一个Ruby模块,该模块使用一个模型类(例如:
Article
)传递给它,我只想验证某些相关数据库表列的一些条件,仅此而已

在我的模块方法中,我尝试使用以下方法

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
但是没有成功:与方法相关的(奇怪的)输出错误是这样的

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>`
Mysql2::错误:表“\u development.//”不存在:显示来自的完整字段`//`

如何在运行时正确检查数据库表列的存在和数据类型?

您可以使用
ActiveRecord::Base.connection
将查询直接发送到DBM


因此,您可以要求DBM描述一个特定的表,然后解析字段以了解有关数据类型的任何信息

您是否希望您的数据库在应用程序下发生变化?数据库应该是静态的,并且它的表、字段和字段类型应该是预先确定的,或者是通过迁移,或者是因为它是遗留的。你为什么不提前知道a型场是什么?任何ORM都必须知道表名、字段名和类型,才能正常工作。ActiveRecord和Sequel在连接后都会检查模式,因此这是一个询问他们的案例。续集让我们很容易找到这些东西,所以我相信ActiveRecord也能做到。但问题依然存在,你为什么需要检查?@铁皮人-(1)你:“你希望你的数据库在你的应用程序下发生变化吗?”。I:不,我没有。(2) 您:“[…]为什么需要检查?”。I:我在问题中写道:“我只想验证某些相关数据库表列的一些条件,仅此而已”。在应用程序启动之前,您应该了解数据库的所有信息,因此,即使不查询数据库,您也可以知道数据类型、字段宽度、字段名称等。您不需要检查任何内容。如果您这样做,则说明数据验证或系统设计有问题。@Tin Man-您是对的,但对于我的需要,当应用程序以开发人员模式启动时,会检查数据库表列。您能否举例说明如何正确使用
ActiveRecord::Base.connection