如何获取具有不同值的列名称

时间:2017-04-13 07:47:51

标签: ruby-on-rails ruby postgresql activerecord

有没有办法找出查询返回的两个或多个记录中没有相同值的列名? 我在Rails上使用ActiveRecord。

以下代码返回许多记录(在我的情况下大于1):

TableName.where(column_1: value)

如果上面的查询返回三条记录,我想知道是否有一种方法可以比较三条记录,并获取值不匹配或不同的列名?

例如,如果上述查询返回这些记录:

 column_1 | column_2 | column_3 | column_4
----------|----------|----------|----------
   value  |    A     |    B     |    C
   value  |    A     |    B     |    C1
   value  |    A     |    B     |    C2

如何比较上述三个记录并找出哪些列具有不同的值? (在这种情况下为column_4)。在我的原始数据库中,我有超过25列,如果存在差异,我需要所有列名。

注意:查询结果以数组形式返回,每个列都可以使用records[i].column_name进行访问。

此外,我需要使用ActiveRecord作为包装器来处理Ruby。我认为这可以使用大量嵌套if / else来完成,但必须有一个优雅的解决方案。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

您可能会在Ruby中收到必要的专栏:

columns = [:column_2, :column_3, :column_4]
various_columns = []
records = TableName.where(column_1: value)
columns.each do |column|
  various_columns << column if records.map(&column).uniq.count > 1
end

或者您可以使用以下查询将计数逻辑放入数据库:

SELECT 
  COUNT(DISTINCT column_2) AS count_column_2,
  COUNT(DISTINCT column_3) AS count_column_3,
  COUNT(DISTINCT column_4) AS count_column_4
FROM table_name
WHERE column_1 = value

用于处理该逻辑的Ruby代码:

columns = [:column_2, :column_3, :column_4]
selects = 
  columns.map do |column|
    "COUNT(DISTINCT #{column}) AS count_#{column}"
  end.join(", ")
record = TableName.select(selects).take(1).first
various_columns = columns.select { |column| record["count_#{column}"] > 1 }

答案 1 :(得分:0)

如果你不介意使用ruby而不是sql,你可以这样做

relation = Table.where(:column_1 => "thing")
relation_size = relation.count

Table.column_names.select do |column_name|
  relation.pluck(column_name).uniq.size != relation_size
end