2016-09-24 136 views
0

我在rails中構建一個任務列表應用程序,允許用戶創建包含任務的任務列表。我正在嘗試設置過濾功能,以便只顯示任務列表,並將其所有任務標記爲完成。通過嵌套資源邏輯過濾ActiveRecord記錄 - Rails

目前:

列表模型:
class List < ActiveRecord::Base 
    belongs_to :user 
    has_many :tasks 
end 
任務模式:
class Task < ActiveRecord::Base 
    belongs_to :list 

    def completed? 
    !completed_at.blank? 
    end 
end 

據我瞭解,ActiveRecord的的.where查詢方法只着眼於在該模型的領域,它的值(例如:@lists.where(name: "List Name")

有沒有人知道一種做類似於下面的僞代碼的方法:

@completed_lists = @lists.where(list.tasks.completed.count == list.tasks.count) 

感謝

回答

0

嘗試使用List.all.map{|list| list if list.tasks.completed.count == list.tasks.count}

+0

您的解決方案提供了N + 1。 –

+0

感謝您的回答,它的效果很好,除了結果是一個數組,而不是一個ActiveRecord關係。有沒有辦法將它轉換回ActiveRecord關係? – slehmann36

0

您可以使用它來加載沒有任何未完成任務的所有清單:

List.where.not(id: Task.where('completed_at IS NULL').pluck('DISTINCT list_id')) 
+0

它將被提供給postgresql上的'GroupingError'。我測試了另一個例子:( –

+0

寫'組('lists.id,tasks.id')'接受查詢在pg上,但我不確定是否正常工作。你對此有何看法? –

+0

我改變了我的答案 – spickermann