我正在尝试一些事情来找到并非所有消息都被删除的对话,现在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 #):
答案 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
方法调用:
一切都是方法可链接的,少了“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
这需要调整,但希望能给你一些关于你能做什么的想法