ruby on rails - 概要 - 行為として読み取り可能なRailsプラグインの問題



ruby on rails ドキュメント (1)

以下は動作します

<%= 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) %>

私は現在構築中のメッセージングシステムのために、IntrideaのActsを読み込み可能な 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 %>

しかし、役に立たない。 私はいつもすべての設定が終わった後、簡単なビューの問題に悩まされるようです。 何か案は?





plugins