我正在构建一个简单的待办事项列表应用程序,其中每个列表可以包含许多任务。
list.rb
class List < ActiveRecord::Base
belongs_to :user
has_many :tasks
endtask.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现在,在我的列表/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>]
发布于 2013-07-02 19:03:58
正常情况下,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-02 17:03:27
当您使用@list.tasks时,它会返回属于此列表的任务,并且所有内容都与预期一致
.all是不推荐使用的方法all,它只是调用find(:all)的别名。
因此,在@list.tasks.all中,您会得到@list.tasks.find(:all),它返回空的enumerable。
发布于 2013-07-02 19:33:12
@list.tasks是一个ActiveRelation,除非迫不得已,否则它实际上不会查询数据库(比如在irb会话期间,它必须将其写入屏幕。
您可以通过在rails控制台中输入: list.tasks.class来验证这一点
而@list.tasks.all将显式地告诉ActiveRelation执行查询。
你可以阅读“惰性评估”来获得更多的信息。
https://stackoverflow.com/questions/17420956
复制相似问题