QA@IT
«質問へ戻る

質問を投稿

お気に入りされた数が多い投稿を降順で取得する

Railsで UserPostを作成でき、各ユーザーは好きなポストにひとつ「お気に入り」をすることができるようにしています。

具体的には以下のようなコードを使っています。

class Post < ActiveRecord::Base
  has_many :favs, dependent: :destroy
  has_many :faved_users, through: :favs, source: :user
end

class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  has_many :favs, dependent: :destroy
  has_many :faved_posts, through: :favs, source: :post
end

class Fav < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

そして最もお気に入りを多くされてるPostを表示するために
Word.order(faved_users: :asc).limit 3 とすると faved_users がカラムとして存在しないためにエラーになります。

中間テーブルを使っている場合はエラーになることがわかったので、
Postfavs_countというカラムを追加し、
お気に入りが登録や削除された時に数字を書き換えるように処理をすることにしたのですが
どうしてもやや煩雑になってしまいます。

中間テーブルを介して取得するSQLを書いたらできるとは思うのですが、
書き方がわからない上にどの程度遅くなるのかもわかりません。

このような状態ではどのようなアプローチが一般的に取られるのでしょうか?
また、SQLにて解決するのが一般的であればどのように書くかも教えて頂けると非常に助かります。

Railsで `User`が`Post`を作成でき、各ユーザーは好きなポストにひとつ「お気に入り」をすることができるようにしています。

具体的には以下のようなコードを使っています。

```
class Post < ActiveRecord::Base
  has_many :favs, dependent: :destroy
  has_many :faved_users, through: :favs, source: :user
end

class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  has_many :favs, dependent: :destroy
  has_many :faved_posts, through: :favs, source: :post
end

class Fav < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end
```

そして最もお気に入りを多くされてるPostを表示するために
`Word.order(faved_users: :asc).limit 3` とすると faved_users がカラムとして存在しないためにエラーになります。

中間テーブルを使っている場合はエラーになることがわかったので、
`Post`に`favs_count`というカラムを追加し、
お気に入りが登録や削除された時に数字を書き換えるように処理をすることにしたのですが
どうしてもやや煩雑になってしまいます。

中間テーブルを介して取得するSQLを書いたらできるとは思うのですが、
書き方がわからない上にどの程度遅くなるのかもわかりません。

このような状態ではどのようなアプローチが一般的に取られるのでしょうか?
また、SQLにて解決するのが一般的であればどのように書くかも教えて頂けると非常に助かります。