私は、Railsガイドで見つけられるものすべてを試してきました。ここでは、2つのモデルの間のアサーションの数によって数えています。Railsアクティブなレコード数の関連付け
コントローラでの問合せ:
def top_mires
@title = "Top Posts"
@posts = Post.joins('INNER JOIN favorites ON posts.id = favorites.favorited_id').select('posts.*, COUNT(favorites.favorited_id) AS favorite_count').group('posts.id').order('favorite_count desc').limit(10)
render 'favorite_posts/show'
end
モデル:
ポスト:
class Post < ApplicationRecord
include PublicActivity::Common
acts_as_taggable
belongs_to :user
has_many :comments
has_many :favorites, as: :favorited
default_scope -> { order(created_at: :desc) }
mount_uploader :picture, PictureUploader
validates :user_id, presence: true
validates :post_type, presence: true
validates :content, presence: true
お気に入り:
class Favorite < ApplicationRecord
include PublicActivity::Model
tracked only: [:create], owner: :user, recipient: :favorited
belongs_to :favorited, polymorphic: true, counter_cache: :favorite_count
belongs_to :user
end
しかし、私は戻って、このエラーを取得する:
SQLite3::SQLException: no such column: favorite_count: SELECT COUNT(*) AS count_all, posts.id AS posts_id FROM "posts" INNER JOIN favorites ON posts.id = favorites.favorited_id GROUP BY posts.id ORDER BY "posts"."created_at" DESC, favorite_count desc LIMIT ?
どのように列がないのですか?私はまた、お気に入りを表示するには、多くの、多くの時間がERB内のポストに数えるが、それはここでは動作しません...
は、
おかげで、これは出しますのSQLです:呼び出すことができます、#<ポストID:293>、#<ポストID:296 [、#、&c'なぜ "post.created_at"でソートされますか?なぜお気に入りにカウントされないのですか? –
ETSchmidt
'SELECT posts.id、COUNT(favorites.favorited_id)から、 "posts" INNER JOINお気に入りON posts.id = favorites.favorited_id GROUP BY posts.id ORDER BY COUNT(favorites.favorited_id)desc LIMIT?
'=>#
] >、#
マークダウンについてごめん... – ETSchmidt
デフォルトでは、rubyのprintはカスタム列を 'favorite_count'として表示しません。 ( 'posts。*、COUNT(favorite.favorited_id)AS favorite_count')。グループ( 'posts.id')を選択してください。注文( 'COUNT(favorites.favorited_id)desc')。制限(10); posts.each {| p | puts "id:#{p.id}、favorite_count:#{p.favorite_count}、created_at:#{p.created_at}"} '。 'created_at' orderとcount orderはあなたのデータと同じです。 –