我试图检查某个列存在于哪个表中。这应该由运行时的应用程序完成。我想用INFORMATION_SCHEMA.COLUMNS表和WHERE语句来做到这一点。当我执行我在pgAdmin中创建的查询时,它可以工作。现在我如何在Rails中访问此表?或者有更好的方法来做我想要的吗?
这是我的查询:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'myColumn'
order by TABLE_NAME
答案 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
您也可以添加其他字段