Acts-as-readable Rails プラグインの問題
-
09-06-2019 - |
質問
イントリディアのものを使っています 読み取り可能なものとして機能する 現在構築中のメッセージング システム用の 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 を確認すると、未読数が次のように取得されていることがわかります。
- すべての投稿を取得する
- ユーザーが読んだすべての投稿を取得する
- 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) %>
所属していません StackOverflow