質問

イントリディアのものを使っています 読み取り可能なものとして機能する 現在構築中のメッセージング システム用の Rails プラグイン。それに応じてメッセージクラスを定義しました。

class Post < ActiveRecord::Base
  acts-as-readable
end

すべてが計画どおりに機能しているように見えますが、アプリのメッセージ ビューに未読メッセージを表示させようとすると、問題が発生します。

彼らの例:(フォーマットの問題のため、アンダースコアをハイフンに変更しました)

bob = User.find_by_name("bob")

bob.readings                      # => []

Post.find_unread_by(bob)          # => [<Post 1>,<Post 2>,<Post 3>...]
Post.find_read_by(bob)            # => []

Post.find(1).read_by?(bob)        # => false
Post.find(1).read_by!(bob)        # => <Reading 1>
Post.find(1).read_by?(bob)        # => true
Post.find(1).users_who_read       # => [<User bob>]

Post.find_unread_by(bob)          # => [<Post 2>,<Post 3>...]
Post.find_read_by(bob)            # => [<Post 1>]

bob.readings                      # => [<Reading 1>]

したがって、メールボックス (たとえば、 Inbox (39) ) にある未読メッセージの数を一覧表示したい場合は、次のようなことができるはずです。

<%= Post.find_unread_by(current-user).count %>

しかし無駄でした。すべてを設定した後、私はいつも単純なビューの問題で行き詰まってしまうようです。何か案は?

役に立ちましたか?

解決

以下は機能します

<%= Post.find_unread_by(current_user).size %>

または

<%= Post.find_unread_by(current_user).length %>

ただし、development.log を確認すると、未読数が次のように取得されていることがわかります。

  1. すべての投稿を取得する
  2. ユーザーが読んだすべての投稿を取得する
  3. 2をすべて削除します。1から。ルビーで

大量の投稿があると、パフォーマンスが非常に悪くなります。

より良い方法は、現在のユーザーが読んだ投稿を取得し、データベース内のすべての投稿を取得せずに ActiveRecord::Calculations を使用してカウントを取得することです。

Post.count(:conditions => [ "id NOT IN (?)", Post.find_read_by(current_user)])

ビューまたはコントローラーにファインダーを持たないというベスト プラクティスに従うために、これを Post モデルに組み込む必要があります。

Post.rb

def self.unread_post_count_for_user(user)
  count(:conditions => [ "id NOT IN (?)", Post.find_read_by(user)])
end

そうすれば、あなたの見解は次のようになります

<%= Post.unread_post_count_for_user(current-user) %>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top