문제

저는 인트리디아를 사용하고 있어요 읽을 수 있는 역할을 합니다. 현재 구축 중인 메시징 시스템용 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 모델에 들어가야 합니다.

포스트.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