9

現在構築しているメッセージングシステムに、IntrideaのActs asReadableRailsプラグインを使用しています。それに応じてメッセージクラスを定義しました。

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>]

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

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

しかし、役に立たない。すべてが設定された後、私はいつも単純なビューの問題で立ち往生しているようです。何か案は?

4

1 に答える 1

11

以下が機能します

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

また

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

ただし、development.logを確認すると、未読数が

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

これは、投稿が多いとパフォーマンスが非常に悪くなります。

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

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

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

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) %>
于 2008-08-22T18:33:33.890 に答える