页面方法不适用于kaminari和邮箱

时间:2014-02-28 10:03:39

标签: ruby-on-rails ruby kaminari mailboxer

我正在尝试一些事情来找到并非所有消息都被删除的对话,现在kaminari页面方法无效。可能是会话是一个哈希值,而delete_if方法是以一种意想不到的方式改变哈希值吗?页面方法在直接与@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 #):

1 个答案:

答案 0 :(得分:0)

<强> PARAMS

首先,您确定使用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

Kaminari&amp; Will_Paginate都会覆盖您从Controller / Model中进行的SQL查询。这意味着您必须致电他们的page&amp; ActiveRecord上的per方法调用:

根据documentation

  

一切都是方法可链接的,少了“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 association extension这样的内容:

#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

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