2017-04-13 18 views
1

クエリによって返された2つ以上のレコードの中で同じ値を持たない列名を見つける方法はありますか? 私はActiveRecord on Railsを使用しています。異なる値を持つ列名を取得する方法

次のコードは、(私の場合は1より大きい)レコードの数を返します。

TableName.where(column_1: value) 

上記のクエリは、3つのレコードを返した場合、私は3を比較することができる方法があるかどうかを知りたいです値が一致しないか、または異なる列名を取得しますか?例えば

上記のクエリは、これらのレコードを返す場合:

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

は、どのように私は上記の3つのレコードを比較し、列は異なる値を持っているかを調べることができますか? (この場合は列_4)。私の元のデータベースでは25以上のカラムがあり、違いがある場合はいつでもすべてのカラム名が必要になります。

注:照会結果は配列形式で戻され、各列はrecords[i].column_nameを使用してアクセスできます。

また、私はこれをRubyでActiveRecordをラッパーとして使用する必要があります。私はこれが多くのネストされたif/elseを使用して行うことができると思いますが、これには優雅な解決策が必要です。

どうすればいいですか?

+0

一意の値が複数あるすべての列をフィルタリングします。 – emaillenin

+0

あなたはどのデータベースを使用していますか? –

+0

データベースはPostgreSQLです –

答えて

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 } 
0

sqlの代わりにrubyを使用しても構いません。

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 
関連する問題