名为scope的Rails不会返回内存中的对象?

时间:2014-01-15 17:02:52

标签: ruby-on-rails

假设我有一个用户模型,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

我的问题是,如何允许命名范围包含内存中的对象?

1 个答案:

答案 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