不清楚是否将值保存到db

时间:2015-08-03 02:53:53

标签: ruby-on-rails ruby ruby-on-rails-4

我的控制器中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我遇到以下奇怪的行为。 singleorganization.users都显示同一用户的详细信息/值。但是,当我使用single进行检查时以及在organization.users中使用debugger时,这些值会有所不同。对于single,用户确实具有activation_digestactivation_sent_at的值,而当我查看nil时,它们为organization.users

任何人都可以解释这种行为吗?由于nilsingle之外无法使用,因此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

1 个答案:

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