읽을 수 있는 역할을 하는 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 모델에 들어가야 합니다.
포스트.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