为什么我不能通过其他方法访问此实例变量(在模型中)?

时间:2018-10-02 15:36:33

标签: ruby-on-rails ruby

我的模型中有一个方法,我用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设置为第一次提交,但是在第二次提交时消失了。

1 个答案:

答案 0 :(得分:0)

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

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