2013-07-02 28 views
0

我正在構建一個簡單的待辦事項列表應用程序,其中每個列表可以包含許多任務。Rails中@ list.tasks和@list.tasks.all的區別

list.rb

class List < ActiveRecord::Base 
belongs_to :user 
has_many :tasks 
end 

task.rb

class Task < ActiveRecord::Base 
belongs_to :list 
attr_accessible :description,:completed 
validates :description, presence: true 
validates :list, presence: true 
end 

我ListsController的表演動作: 列表#顯示

def show 
    @list = List.find_by_id(params[:id]) 
    @task [email protected] 
end 
在我的名單

現在/ show.html .erb其中我顯示了該特定列表下的所有任務:

<% raise @list.tasks.all.inspect %> 

這給出了輸出[]。但是,當我改變show.html.erb像這樣:

<% raise @list.tasks.inspect %> 

這使輸出[#<Task id: nil, description: nil, list_id: 13, created_at: nil, updated_at: nil, completed: nil>]

回答

1

通常構建只會在集合中創建一條記錄,而不會存儲到數據庫。

因此,在這種情況下,數據庫中的數據記錄已被檢索。由於您尚未存儲任何記錄,因此您將得到一個空集。

<% raise @list.tasks.all.inspect %> 
# [] 

在這種情況下,

@task [email protected] # create a empty record with list_id in the collection tasks 
#<Task id: nil, description: nil, list_id: 13, created_at: nil, updated_at: nil, completed: nil> 

<% raise @list.tasks.inspect %> # Get data from collection. Collection holds database records + recently built records. 
[#<Task id: nil, description: nil, list_id: 13, created_at: nil, updated_at: nil, completed: nil>] 

如果你想給你最新內部保存到數據庫,然後執行以下操作。

@list.save # it will commit the records built to database 

現在,如果你這樣做@ list.tasks.all.inspect你會從數據庫中獲取的所有記錄。

@list.tasks.all.inspect 
[#<Task id: 1, description: nil, list_id: 13, created_at: nil, updated_at: nil, completed: nil>] 
1

當您使用@list.tasks返回屬於這個列表的任務,並如預期的一切

.all是已棄用的方法all這僅僅是調用find(:all)的別名。

因此,在@list.tasks.all中,您將獲得@list.tasks.find(:all),它將返回空的枚舉。

+0

那麼,這是否意味着'find(:all)'方法只返回已保存的記錄? – lnreddy

+0

不,它嘗試使用鍵找到散列:all。 :這裏不是一種方法。還有任務列表,你爲什麼要打電話給那個名單上的所有人? – Tala

0

@ list.tasks是ActiveRelation,也不會真正查詢數據庫,除非它有(比如當它有一個IRB會議期間將它寫在屏幕上。

您可以驗證這一點自己通過鍵入:list.tasks.class一軌控制檯

內,而@ list.tasks.all會明確地告訴ActiveRelation執行查詢

可以爲更多的做一些閱讀上的「懶惰評估」。信息

+0

我只是嘗試List.find(6).tasks.class在控制檯中,它沒有查詢數據庫..所以List.find(6).tasks.all.class .. – lnreddy

相關問題