web-dev-qa-db-ja.com

Rails:列から一意の値を取得する方法

テーブルの列から一意の値を取得するにはどうすればよいですか?たとえば、次のProductsテーブルがあります。

ID NAME CATEGORY
1 name1 1st_cat
2 name2 2nd_cat
3 name3 1st_cat

ここでは、1st_catと2nd_catの2つの値のみを取得します。

<%Products.each do |p|%>
<%=p.category%>
<%end%>
61
Oleg Pasko

さらに2つの方法:

Products.select(:category).map(&:category).uniq

Products.uniq.pluck(:category)

Rails> = 5.1の場合:

Products.distinct.pluck(:category)
135
user664833

これができると思う:

<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>

ソース: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

26
ThatOtherPerson

これにより、データベースサーバーですべての作業が行われます。結果は単純な配列です。

<% Product.distinct(:category).pluck(:category).each do |category|
    <%= category %>
<% end %>

Railsは、任意のデータベース(Postgres、MySQLなど)で動作するSQLを生成します。

SELECT DISTINCT "products"."category" FROM "products"
9
jelder

uniqはRails 5以降廃止され、Rails 5.1で削除されるため、Products.all.distinct.pluck(:category)を使用することを推奨します

7
Fabio Ros

これを試してください(Railsコンソールで)

Product.group(:category)

Product.group(:category).each { |p| p.name }
6
maprihoda

Postgresの場合

<% Product.select("DISTINCT ON (category) *").each do |category|
    <%= category %>
    <%= name %>
<% end %>

更新

さらに良い

<% Product.select(%(DISTINCT ON (category) "#{Product.table_name}".*)).each do |category|
    <%= category %>
    <%= name %>
<% end %>

joinsを実行すると間違った列を返す可能性があるためです(たとえば、結合テーブルからid列を返しますが、productsは返しません)

2
srghma

一意の出力を取得する必要があり、「uniq」メソッドの試行に失敗しました。ここに投稿されたいくつかのソリューションを試してみましたが失敗しました。私はcurrent_userメソッドへのアクセスを提供するdeviseを使用しており、2つのテーブルを操作しています。1つは結合(アイテムhas_many:things)です。

このソリューションは最終的に私のために働いた:

@current_user.things.select(:item_fk).distinct.each do |thing|
 <%= thing.item.attribute %>
<% end %>
0
Phil_ish