テーブルの列から一意の値を取得するにはどうすればよいですか?たとえば、次の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%>
さらに2つの方法:
Products.select(:category).map(&:category).uniq
Products.uniq.pluck(:category)
Rails> = 5.1の場合:
Products.distinct.pluck(:category)
これができると思う:
<% Products.select("DISTINCT(CATEGORY)").each do |p| %>
<%= p.category %>
<% end %>
ソース: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
これにより、データベースサーバーですべての作業が行われます。結果は単純な配列です。
<% Product.distinct(:category).pluck(:category).each do |category|
<%= category %>
<% end %>
Railsは、任意のデータベース(Postgres、MySQLなど)で動作するSQLを生成します。
SELECT DISTINCT "products"."category" FROM "products"
uniq
はRails 5以降廃止され、Rails 5.1で削除されるため、Products.all.distinct.pluck(:category)
を使用することを推奨します
これを試してください(Railsコンソールで)
Product.group(:category)
Product.group(:category).each { |p| p.name }
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
は返しません)
一意の出力を取得する必要があり、「uniq」メソッドの試行に失敗しました。ここに投稿されたいくつかのソリューションを試してみましたが失敗しました。私はcurrent_user
メソッドへのアクセスを提供するdeviseを使用しており、2つのテーブルを操作しています。1つは結合(アイテムhas_many:things)です。
このソリューションは最終的に私のために働いた:
@current_user.things.select(:item_fk).distinct.each do |thing|
<%= thing.item.attribute %>
<% end %>