新手问题 关于 Rails 的动态模型,不重启服务器是不是不能更新呢?

yan32768 · 2015年10月21日 · 最后由 yan32768 回复于 2015年11月15日 · 2667 次阅读

自己动态加了一个模型 class t1<activerecord::base;end,使用 T1 类可以实现表的各种操作,然后对应表重新创建了一下,表名不变,新加入了几列,但表里新加入的列就没法访问了,应该是模型生成的列名没有更新吧,谁知道怎么来更新它,我试过重定义 class t1 是无效的,关闭各种缓存无效,取消 t1 的定义无效,怎么办呢?

建议仔细说一下你做了什么。 创建表是用的 Migration 吗?

#1 楼 @msg7086 没有,使用 create_table 动态建表,动态访问,在服务启动前,该表不存在。

#1 楼 @msg7086 eval('Temptb=class '+tmptablename.humanize+'< ActiveRecord::Base;self;end') 就是动态加了一个模型,但我对这个表结构做了修改,再调用 Temptb,修改的内容不能跟过来,报方法未定义。 使用 Object.instance_eval{remove_const(:Temptb)} #Temptb.connection.schema_cache.clear! 这两个方法依然不能清除前面定义的模型。只有重新启动服务器才行。

也曾遇到类似问题,重启服务器。

#4 楼 @hmilym ,顶一下,高手们都去哪了,rails 本身都能实现,我觉得只是没有找到合适的途径,肯定是可以解决的。

try

YourModel.connection.schema_cache.clear!
YourModel.reset_column_information

#6 楼 @huobazi clear! 方法试过了,不行,有空我试试第二个方法。我忽然想到了一种思路,是不是 rails,使用的 migrate 组件完成的动态模型修改呢?

在线上动态建立表单和重载模型不是个好方案,不要这样做。

#8 楼 @rei 大神,客户要求自己建模型,你说有什么好的方法吗?我想了很多天,才找到这个方法。还有一种就是去生成模型文件,可还是要重启服务才能加载啊,并且文件不如数据表好控制。

#9 楼 @yan32768 业务层抽象一个模型,底层数据库不变。

#10 楼 @rei 嗯。是个办法,那样的话,所有数据库表的关联查询什么的,包括各类 sql 统计函数,是不是都要自己手写?等于自己做个数据库系统了,想想就麻烦啊。

#11 楼 @yan32768 客户要的就是数据库管理软件?那么找个现成的给他们啊。

#12 楼 @rei ,需求是很奇葩,但你想一想,如果客户有很多的数据,各式各样的,需要建非常多的表,数量不固定,又需要实现相同功能的逻辑处理,项目后期维护都困难。

#7 楼 @yan32768 6 楼已经是正解,还有高手不是天天给你回答问题的,你这样说话很容易引起别人反感。

建议直接拿 phpmyadmin 来改

#6 楼 @huobazi 谢谢,的确有效,当时我也是找到了 schema_cache,但没注意还需要 reset_column_information。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号