Rails中@ list.tasks和@ list.tasks.all之间的区别

时间:2013-07-02 08:33:24

标签: ruby-on-rails-3 ruby-on-rails-3.2

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

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的show动作: 列表#节目

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

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

3 个答案:

答案 0 :(得分:1)

当您使用@list.tasks时,它会返回属于此列表的任务,并且所有内容都符合预期

.all已弃用方法all,它只是调用find(:all)的别名。

因此,在@list.tasks.all中,您获得@list.tasks.find(:all),返回空的可枚举。

答案 1 :(得分: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>]

答案 2 :(得分:0)

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

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

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

您可以阅读“延迟评估”以获取更多信息