Acts-as-readable Rails插件问题

时间:2008-08-22 17:37:51

标签: ruby-on-rails ruby plugins

我正在使用Intridea的Acts as Readable 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>]

所以看来,如果我想列出邮箱中的未读邮件数量(例如收件箱(39)),我应该可以这样做:

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

但无济于事。在设置好所有内容之后,我似乎总是陷入简单的视图问题。 有什么想法吗?

1 个答案:

答案 0 :(得分:11)

以下内容可行

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

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

但是,如果您检查您的development.log,您应该看到它通过

获得未读计数
  1. 检索所有帖子
  2. 检索用户阅读的所有帖子
  3. 从红宝石中删除所有2.来自1.
  4. 对于很多帖子来说,这将是非常糟糕的表现。

    更好的方法是检索当前用户读取的帖子,然后使用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) %>