我的控制器中create
方法的一部分是:
if @organization.relationships && @organization.relationships.where('member = ?', true).any?
@organization.users.where('member = ?', true).each do |single|
single.create_digest
debugger
end
end
正如您所看到的,我一直在使用debugger
进行测试。在debugger
我遇到以下奇怪的行为。 single
和organization.users
都显示同一用户的详细信息/值。但是,当我使用single
进行检查时以及在organization.users
中使用debugger
时,这些值会有所不同。对于single
,用户确实具有activation_digest
和activation_sent_at
的值,而当我查看nil
时,它们为organization.users
。
任何人都可以解释这种行为吗?由于nil
在single
之外无法使用,因此if statement
值存在问题。我不清楚该值是否已保存到数据库。
P.S。正在使用的模型方法:
def create_digest
create_activation_digest
update_attribute(:activation_digest, self.activation_digest)
update_columns(activation_sent_at: Time.zone.now)
end
答案 0 :(得分:1)
当您在Rails中查询模型(在您的案例中为用户)时,每个不同的查询都会返回这些模型的单独副本。
例如,此查询返回的用户:
@organization.users.where('member = ?', true)
将是这个略有不同的查询返回的用户的单独副本(我假设这是您在调试器中运行的):
@organization.users
如果修改用户的一个副本并将修改保存到数据库,则它不会自动将这些修改传播到用户的另一个副本。另一个副本仍然具有首次运行查询时返回的(现在已过期)数据。
要验证更改是否实际持久保存到数据库,您可以通过调用reload
强制Rails使用数据库中的最新数据刷新用户对象。例如:
# These are two different in-memory copies of the same user
user = @organization.users.where('member = ?', true).first
user_copy = User.find(user.id)
user.create_digest
# The copy is now out of date
user_copy.activation_sent_at # => nil
# Refresh the copy from the database
user_copy.reload
user_copy.activation_sent_at # => 2015-08-02 21:00:50 -0700