首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails中@list.tasks和@list.tasks.all的区别

Rails中@list.tasks和@list.tasks.all的区别
EN

Stack Overflow用户
提问于 2013-07-02 16:33:24
回答 3查看 52关注 0票数 0

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

list.rb

代码语言:javascript
复制
class List < ActiveRecord::Base
 belongs_to :user
 has_many :tasks   
end

task.rb

代码语言:javascript
复制
class Task < ActiveRecord::Base
 belongs_to :list
 attr_accessible :description,:completed
 validates :description, presence: true
 validates :list, presence: true
end

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

代码语言:javascript
复制
 def show
  @list = List.find_by_id(params[:id])
  @task =@list.tasks.build
 end

现在,在我的列表/show.html.erb中,我显示了该特定列表下的所有任务:

代码语言:javascript
复制
<% raise @list.tasks.all.inspect %>

这将给出输出[]。但是当我像这样修改show.html.erb时:

代码语言:javascript
复制
<% raise @list.tasks.inspect %>

这将给出输出[#<Task id: nil, description: nil, list_id: 13, created_at: nil, updated_at: nil, completed: nil>]

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-02 19:03:58

正常情况下,build只会在集合中创建一条记录,而不会将其存储到数据库中。

因此,在本例中,已检索到数据库中的数据记录。由于您还没有存储任何记录,因此您将得到一个空集。

代码语言:javascript
复制
<% raise @list.tasks.all.inspect %>
# []

在这种情况下,

代码语言:javascript
复制
 @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>]

如果您想要将最近的构建保存到数据库中,请执行以下操作。

代码语言:javascript
复制
@list.save # it will commit the records built to database

现在,如果您执行@list.tasks.all.inspect,您将从数据库中获取所有记录。

代码语言:javascript
复制
@list.tasks.all.inspect
[#<Task id: 1, description: nil, list_id: 13, created_at: nil, updated_at: nil, completed: nil>]
票数 1
EN

Stack Overflow用户

发布于 2013-07-02 17:03:27

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

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

因此,在@list.tasks.all中,您会得到@list.tasks.find(:all),它返回空的enumerable。

票数 1
EN

Stack Overflow用户

发布于 2013-07-02 19:33:12

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

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

而@list.tasks.all将显式地告诉ActiveRelation执行查询。

你可以阅读“惰性评估”来获得更多的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17420956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档