ruby-on-rails - 如何获取具有不同值的列名

标签 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 来完成,但必须有一个优雅的解决方案。

我该怎么做?

最佳答案

您可能会收到必要的 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 }

关于ruby-on-rails - 如何获取具有不同值的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43386445/

相关文章:

ruby-on-rails - ruby 中具有多个multi_match查询的Elasticsearch DSL

ruby-on-rails - Ruby On Rails 功能测试 :index with a polymorphic model

ruby-on-rails - 如何在 Rails 4 中将 where 条件与 "or"链接起来?

sql - 从 WHERE 子句中的 SELECT 子句引用数组

ruby-on-rails - spree 商务 : User Login through API

ruby - 将 macOS 更新到 Big Sur faSTLane 后失败

ruby - 使用接受参数作为先决条件的 rake 任务

sql 计算以以下开头的行的频率

postgresql - Docker-compose:应用程序无法连接到 Postgres 容器

ruby-on-rails - 基本表单操作不适用于 heroku(但在本地有效)