ruby-on-rails - 为什么我不能从另一个方法访问这个实例变量(在模型中)?
问题描述
我的模型中有一个方法,我调用它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
在第一次提交时设置,但在第二次提交时消失。
解决方案
最初我认为 ActiveRecord 在 after_commit 之前的某个时间重新加载记录,或者至少重新初始化它。我检查了 Rails 5.2.1,实例变量没有任何反应,它们保持正确设置。这意味着(除非您使用的是旧版 Rails),给定用户根本没有图片,您的代码似乎无法处理。
此外,您after_commit
也将在更新对象后运行,这可能是问题,因为在这种情况下不会设置您的变量。
推荐阅读
- c# - AutoMapper ForPath - 路径中有集合
- java - 如何在Java中找到具有负增量以及正负值的随机值?
- docker - 是否有任何可能的解决方案可以在 Jenkins 的帖子部分(声明性管道)下运行 docker?
- python - “groupby”返回每个分组项目的出现百分比
- python-3.x - Weasyprint 输出不显示大部分原始网页?
- javascript - 我无法理解这段代码中的 parseInt 方法
- c++ - 您可以在 if 语句中使用数字范围吗?
- flutter - 我在哪里可以获得 VSCode 中 dart 启动的配置?
- python - 使用每个选择标准的用户输入循环遍历数据框
- python-3.x - Socket/ZeroMQ – 分段错误 python