Rails 6中如何将变量作为ActiveRecord对象的列名调用
你可以通过Ruby原生的动态方法调用,或者ActiveRecord提供的属性读取方法实现需求,无需新增额外的模型方法:
方式1:使用public_send动态调用方法(适用范围更广,支持调用模型自定义方法)
Ruby支持通过方法名字符串/符号动态调用对象的公开方法,你可以直接用:
user.public_send(type)
相比直接用send,public_send只会调用对象的公开方法,避免意外调用到私有敏感方法,安全性更高。
方式2:使用ActiveRecord属性下标读取(仅适用于数据库字段)
如果type对应的都是模型的数据库字段,你可以直接用ActiveRecord实例的下标读取方法,实现和调用属性getter完全一致的效果:
user[type]
安全注意事项
如果type参数是用户可操控的输入,必须先加白名单校验,避免用户传入恶意方法名导致安全问题,简化后的完整方法示例:
def foo(type, user) # 白名单控制允许的type取值,后续新增取值只需要更新这个数组即可 allowed_types = %w[foo bar] user.public_send(type) if allowed_types.include?(type) end
内容的提问来源于stack exchange,提问作者Mateusz Adam Katana
相关产品推荐
相关产品推荐

