Rails中如何添加不关联数据库的“伪”ActiveRecord模型类?
解决Rails多态关联中System伪模型的NoMethodError问题
嘿,这个问题我之前在项目里刚好碰到过,其实完全不用费劲去搞一个不关联数据库的ActiveRecord模型,只需要给你的System类加几个关键方法就能完美解决报错,还能满足单例的需求。
最简洁的解决方案:创建带必要方法的单例System类
我们不需要让System继承ActiveRecord::Base,只需要实现多态关联依赖的几个核心方法,同时用单例模式确保全局只有一个System实例:
class System # 引入单例模块,保证全局只有一个System实例 include Singleton # 解决NoMethodError: undefined method `primary_key' for System:Class的核心 def self.primary_key 'id' end # 给System实例一个固定的ID(只要不与User/Admin的ID冲突即可,比如用0) def id 0 end # 可选:如果需要显示系统名称,添加name方法 def name 'System' end # 可选:如果需要像ActiveRecord模型一样支持路由参数(to_param) def to_param id.to_s end end
怎么使用?
创建Post的时候直接调用System.instance作为author即可:
Post.create(title: "系统自动发布公告", content: "这是系统生成的内容", author: System.instance)
为什么这个方案可行?
Rails的多态关联本质上只依赖两个点:
- 关联对象要有
id属性(用来存储到author_id字段) - 关联类要能响应
primary_key方法(Rails在处理关联时会检查这个,避免你遇到的那个报错)
单例模式的使用也刚好符合你“System仅存单例实例”的要求,完全不需要把它存入数据库。
内容的提问来源于stack exchange,提问作者Qqwy
相关产品推荐
相关产品推荐

