Techioz Blog

明確な多態性の関連付けを取得する方法

概要

重複を持たずにポリモーフィックな関係のリストを表示しようとしています。

viewable という多態性フィールドを持つ StoreViews テーブルがあります (つまり、テーブルには viewable_id と viewable_type 列があります)。ここで、各多態性リレーションが重複せずに 1 回だけ表示されるビューを表示したいと考えています。

@views = StoreView.
    .distinct(:viewable_id)
    .distinct(:viewable_type)
    .order("created_at DESC")
    .limit(10)

したがって、StoreViews に 2 つのレコードがあり、両方とも同じ表示可能な関係を持つ場合、@views は最新のもののみを返す必要があります。しかし、そうではありません。

解決策

unique は、レコードが一意であるかどうかを指定するパラメーターとしてブール値のみを受け入れます。したがって、distinct(:viewable_id) は、distinct(true) と同等であり、必要なことを実行しません。 Distinct を使用する代わりに、group 属性に基づいて個別のレコードを含む配列を返す group を使用する必要があります。最新のものを返すには、created_at による順序付け (order 付き) とは別に、グループにフィールドを追加する必要があります。

@views = StoreView
         .order(viewable_id: :desc, viewable_type: :desc, created_at: :desc)
         .group(:viewable_id, :viewable_type)

返されたレコードを created_at で並べ替える必要がある場合は、これを追加する必要があります。