访问Rails中的INFORMATION_SCHEMA

时间:2017-05-05 12:41:47

标签: mysql ruby-on-rails

我试图检查某个列存在于哪个表中。这应该由运行时的应用程序完成。我想用INFORMATION_SCHEMA.COLUMNS表和WHERE语句来做到这一点。当我执行我在pgAdmin中创建的查询时,它可以工作。现在我如何在Rails中访问此表?或者有更好的方法来做我想要的吗?

这是我的查询:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME = 'myColumn'
order by TABLE_NAME

2 个答案:

答案 0 :(得分:0)

您可以查看 rails控制台

rails c

在这里,您可以运行模型方法,包括Model.column_names,它将为您提供模型的列名。

如果您需要查找模型的所有名称,可以在rails控制台中运行以下内容:

ActiveRecord::Base.connection.tables.map do |model|
  model.capitalize.singularize.camelize
end

这将为您提供所有模型名称。

另一种方法是 rails db console

rails db

您可以在此处运行SQL语句。

修改

Supouse你有一个名为fighting column_name ,你想知道它是否是模型的列名, 如果是,你想知道模型。

如果是这种情况,您可以这样做:

@column_name = 'fighting'   #the column that you want to search
@find_it = 'not found'
array_model = []

#find all the Model names
array_model = ActiveRecord::Base.connection.tables.map do |model|
  model.capitalize.singularize.camelize
end

array_model.delete_if{|i|i=='SchemaMigration'} #Remove the SchemaMigration

#Get the `column_names` of every Model, and check if is the name that you are searching
array_model.each do |model|
    tmp = eval model + ".column_names" 
    tmp.each {|col| @find_it = model if col == @column_name} 
end

您将在@find_it中找到您的表名。

答案 1 :(得分:0)

如果原始查询有效,您可以使用 ActiveRecord::Base.connection.execute

执行该查询
def find_tables_for(column_name)
  return unless column_name
  ActiveRecord::Base.connection.execute(
    "SELECT table_name FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE COLUMN_NAME = '#{column_name}'
     ORDER BY TABLE_NAME"
  ).values.flatten
end

$~ find_tables_for('user_id')
#=> ["profiles", "posts"]

此方法将返回具有column_name

的所有表
  

注意:我故意只选择table_name您也可以添加其他字段