ruby-on-rails - 如何管理用于 API Rails 的变量/实例变量
问题描述
我有两种编码方式,但我不知道哪一种更适合记忆。
def create
user = User.find(params[:id])
address = nil
user.transaction do
address = user.address.create!(params[:address_params])
end
render json: user, address
end
或者
def create
@user = User.find(params[:id])
@user.transaction do
@address = user.address.create!(params[:address_params])
end
render json: @user, @address
end
在这种情况下,我会选择第二个。但是我的同事担心第一个是内存最佳选择,以防像 after_action @instance_variable 这样的回调在 after_action 完成之前不会返回内存
所以我想哪个更好以及如何。谢谢ps。如果我的措辞/代码不清楚,对不起我的英语不好,我会修复它
解决方案
经验法则是不创建实例变量并使用局部变量,除非要在另一种方法中重用该变量(现在可以说这不是最佳实践。)
无论如何,如果您的代码要重用该变量,它就是实例变量,因为局部变量将在方法返回后被垃圾回收,并且通常无法从范围之外访问。
也就是说,以下代码有效:
class Foo
def initialize
@bar = 42
end
def calc
@bar / 2
end
end
Foo.new.calc
而以下一个提出:
class Foo
def initialize
bar = 42
end
def calc
bar / 2
end
end
Foo.new.calc
但是,它对内存消耗的影响很小,如果没有的话。实例变量永远不是瓶颈(当然,除非它是千兆字节),并且在为局部变量留出作用域之后,也不会承诺立即进行垃圾收集。
推荐阅读
- symbols - 为什么某些方程中的某些常数的符号在我们将其赋值为 1 时会被消除?
- angular - 以角关闭活动模态
- html - 将html转换为响应式
- python - 使用循环删除列表中不满足某些条件的元素
- wsgi - pythonanywhere - 如何配置 pythonanywhere_com_wsgi.py
- spring - 无法下载 Spring Roo
- c# - 如何从 Unity 项目登录 Microsoft Graph?
- reactjs - 还有其他有效的方法可以通过反应组件将对象作为道具传递吗?
- question-answering - 微调 deeppavlov 问答模型 SQuAD
- mongodb - 使用键值对的键进行 Mongodb 查找