首页 > 解决方案 > 为什么我不能从另一个方法访问这个实例变量(在模型中)?

问题描述

我的模型中有一个方法,我调用它before_create

  def first_position
    if [...]
      [...]
    else
      @last_known = Picture.where(user_id: user_id).order('position desc').first
      self.position = nil
    end
  end

我还有另一种方法可以调用after_commit

  def default_position
    pictures = Picture.where(user_id: user_id).where('created_at > ?', @last_known.created_at)

    i = @last_known.position + 1
    pictures.each do |pic|
      pic.position = i
      i += 1
    end
  end

但在 中default_position@last_known返回nil。你知道为什么吗?

编辑:

好吧,我发现我有两个提交,但与图片有关的那个是第二个,所以@last_known在第一次提交时设置,但在第二次提交时消失。

标签: ruby-on-railsruby

解决方案


最初我认为 ActiveRecord 在 after_commit 之前的某个时间重新加载记录,或者至少重新初始化它。我检查了 Rails 5.2.1,实例变量没有任何反应,它们保持正确设置。这意味着(除非您使用的是旧版 Rails),给定用户根本没有图片,您的代码似乎无法处理。

此外,您after_commit也将在更新对象后运行,这可能是问题,因为在这种情况下不会设置您的变量。


推荐阅读