RailsでECサイトを作成する際、メイン商品のカテゴリーに紐づいた関連商品をコントローラーで取得し、メイン商品のビューで表示させたいという時に、
・関連商品にメイン商品が取得されてしまう
・異なるカテゴリーごとにそれぞれ同じ商品を取得してしまう
(例えばRuby Bagという商品がRuby、BAGSという複数のカテゴリにそれぞれ属していると、
BAGSの関連商品でRuby Bagが2回表示されてしまう。)
という問題が発生した。その時に解決法として使用した方法をメモしておく。
使用したコード
@related_productsで@productの関連商品を、一意かつ@productを含まずに取得
@product = Spree::Product.find(params[:id])
@related_products = Spree::Product.in_taxons(@product.taxons).includes(master: [:images, :default_price]).where.not(id: @product.id).distinct
where.not(条件)
条件に一致しないものを取得する。
例 hogeという名前のユーザー以外のユーザーを取得する
User.where.not(name: "hoge")
distinct
重複のない一意のレコードを取得する。
なお、同様のメソッドにuniqがあるが、Rails5から非推奨となり、distinctが推奨されている。
参考
http://railsdoc.com/references/not
https://railsguides.jp/active_record_querying.html