2014-02-28 42 views
1

我試圖找幾個事情來找到並非所有郵件都已被刪除的對話,現在kaminari頁面方法不起作用。難道說對話是一種散列,而delete_if方法以一種意想不到的方式改變散列?當直接與@mailbox.conversations.page(params[:page_1]).per(9)一起使用時,頁面方法將起作用,因此它必須是使其無法工作的delete_if塊。頁面方法不適用於kaminari和郵箱

這裏是我的行動:

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

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 & Will_Paginate都覆蓋您將從Controller/Model中創建的SQL查詢。這意味着你必須調用它們page & per方法對ActiveRecord的呼籲:

由於每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 

這將需要調整,但希望會給你一些想法,你可以做什麼

+1

謝謝您的回覆是的,它是設置在第一次談話變量,把事情搞糟。 –

+0

小心點,我不認爲Mlennie真的想'摧毀'任何物體。 Mlennie只是想獲得一個set/array/ActiveRecord :: Relation'並不是所有的消息都被刪除了,'delete_if'完成了這個(如果效率低下)。使用'delete_if'返回一個數組,其中滿足塊中指定條件的所有對象都已被刪除。但它實際上並不會從數據庫中「銷燬」任何持久數據。 – johnnycakes

+0

同意。如果她想做你說的話,她應該使用'scope'或'where'調用來加載具體數據 –

相關問題