我正在构建一个简单的待办事项列表应用,其中每个列表都可以包含许多任务。
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>]
答案 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执行查询。
您可以阅读“延迟评估”以获取更多信息