1

我正在尝试一些事情来查找并非所有消息都已删除的对话,现在 kaminari 页面方法不起作用。难道对话是一个散列,而 delete_if 方法以一种意想不到的方式改变了散列?page 方法在直接使用时有效,@mailbox.conversations.page(params[:page_1]).per(9)因此它必须是 delete_if 块使其不起作用。

这是我的行动:

def index  
    @conversations = @mailbox.conversations.delete_if do |c|
        receipts = c.receipts_for @master
        (receipts.where(deleted: true).count == receipts.count)  
    end
    @conversations = @conversations.page(params[:page_1]).per(9)
end

我还使用了 .find_each 而不是 delete_if。

这是我看到的错误

NoMethodError (undefined method `page' for #):
4

1 回答 1

0

参数

首先,你确定你打算使用params[:page_1]- 如果你正在发送?page=x,它只是params[:page]


方法

其次,您的undefined method错误是因为您没有调用有效的 ActiveRecord 对象:

def index  
    @conversations = @mailbox.conversations.delete_if do |c|
        receipts = c.receipts_for @master
        (receipts.where(deleted: true).count == receipts.count)  
    end
    @conversations = @conversations.page(params[:page_1]).per(9)
end

是什么@conversations

KaminariWill_Paginate都覆盖了您将从控制器/模型中进行的 SQL 查询。这意味着您必须在 ActiveRecord 调用中调用他们的page&方法:per

根据文档

一切都是可链接的方法,更少的“Hasheritis”。你知道,这就是 Rails 3 的方式。分页值没有特殊的集合类或任何东西,而是使用通用 AR::Relation 实例。所以,当然你可以在分页器范围之前或之后链接任何其他条件

我相信你会更好地做这样的事情:

def index  
    @mailbox.conversations.each do |c|
        receipts = c.receipts_for @master
        c.destroy if (receipts.where(deleted: true).count == receipts.count)  
    end
    @conversations = @mailbox.conversations.page(params[:page]).per(9)
end

更新

如果您不想要destroy您的项目,您可以使用ActiveRecord 关联扩展,如下所示:

#app/controllers/your_controller.rb
def index  
    @conversations = @mailbox.conversations.receipts.page(params[:page]).per(9)
end

#app/models/model.rb
Class Model < ActiveRecord::Base
    has_many :conversations do

        def receipts
            receipts = joins(:receipts_for).select("COUNT(*)")
            proxy_association.target.delete_if do
                receipts.where(deleted: true) == receipts
            end
        end

    end
end

这需要调整,但希望能给你一些关于你能做什么的想法

于 2014-02-28T10:24:57.710 回答