假设我有一个用户模型,has_many
项目。
class User < ActiveRecord::Base
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :project
scope :optionals, -> { where(optional: true) }
scope :non_optionals, -> { where(optional: false) }
end
如您所见,项目有一个名为optional
的布尔属性。
我为用户构建了一个新项目,
@user = User.find(1)
@user.projects.build(optional: false)
我可以通过
在内存中看到该对象@user.projects # returns all projects, including the one in memory built above
根据控制台,上面对@user.projects
的调用会导致数据库访问。以下调用也会访问数据库,但不包括内存中的对象:
@user.projects.non_optionals # doesn't return the object built in memory above
我的问题是,如何允许命名范围包含内存中的对象?
答案 0 :(得分:3)
.build只在Ruby空间中创建一个新对象,实际上它等同于使用已经填充的用户属性的.new:
# @user.projects.build(optional: false) is equivalent to
Project.new(user: @user, optional: false)
查询数据库自然不会返回此记录,因为它不存在。您可以使用.create构建和将对象持久保存到数据库中:
@user.projects.create(optional: false)
@user.projects # will include the object created previously
# you can consider .create as .build.save