0

我正在构建一个简单的待办事项列表应用程序,其中每个列表可以包含许多任务。

列表.rb

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

任务.rb

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

我的 ListsController 的显示动作:Lists#show

 def show
  @list = List.find_by_id(params[:id])
  @task =@list.tasks.build
 end

现在在我的 lists/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>]

4

3 回答 3

1

当您使用@list.tasks它时,它会返回属于此列表的任务,并且一切都按预期进行

.all是不推荐使用的方法all这只是调用的别名find(:all)

因此,在@list.tasks.all你得到@list.tasks.find(:all)which 返回空可枚举。

于 2013-07-02T09:03:27.183 回答
1

通常 build 只会在集合中创建一条记录,它不会存储到数据库中。

所以在这种情况下,已经从数据库中检索了数据记录。由于您尚未存储任何记录,因此您将获得一个空集。

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

在这种情况下,

 @task =@list.tasks.build  # 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>]
于 2013-07-02T11:03:58.340 回答
0

@list.tasks 是一个 ActiveRelation 并且不会实际查询数据库,除非它必须(比如在 irb 会话期间必须将其写入屏幕时。

您可以通过在 rails 控制台中键入: list.tasks.class 自己验证这一点

而@list.tasks.all 将明确告诉ActiveRelation 执行查询。

您可以阅读“惰性评估”以获取更多信息

于 2013-07-02T11:33:11.703 回答