我有一个非常奇怪的问题。我从数据库中获取了Rails ActiveRecord模型的集合,但集合中的第一个模型没有模型属性/方法,只有标准的ActiveRecord基本方法。其余的都具有所有属性。它只在我使用Passenger的生产debian服务器上执行此操作。它适用于OS X和cygwin。
有什么想法吗?
谢谢, 凯文
答案 0 :(得分:0)
生产数据库中的数据可能不好。
我会调高你的日志级别(生产环境不会记录SQL查询),找到正在生成的查询,然后打开你的生产数据库并运行查询并查看它返回的内容。
答案 1 :(得分:0)
如果不进行一些调试,很难确定这一点,但我可能考虑调查的一件事是线程问题。我相信,ActiveRecord会在需要时动态定义这些方法,并且您可能在访问第一个模型的过程中访问它们。 Ruby的“require”语句可能会出现类似的问题 - 如果你在一个线程中需要某些东西,当你试图在另一个线程中访问它时,该类可能还没有完全定义。
答案 2 :(得分:0)
当你说集合中的第一个模型没有模型属性/方法时,是不是因为当你试图调用其中一个时出现NoMethodError
异常?
模型对象在尝试实际调用它们之前,没有属性方法(例如,在转储object.methods
的输出时)是正常的。当您尝试调用其中一个缺少的方法时,会触发ActiveRecord
的{{1}}处理程序,并且只要方法名称与数据库中定义的某个列的名称匹配,将动态创建,不会出现任何异常。如果没有发生,那要么是因为对象属于错误的类(与您期望操作的模型不匹配),要么是因为插件或gem在method_missing
处理链中因行为不当而干扰
你可以转储到日志(logger.info或logger.info,具体取决于你的日志级别)无属性对象实例的self.class.name等于什么?您是否还可以对生产中安装的宝石(和相应版本)进行本地审核?
答案 3 :(得分:0)
问题是我没有为SQL Server 2005使用正确的freetds版本。我使用的旧协议版本不支持超过30个字符的列名,这就是为什么它找不到属性我正在打电话。它被截断了。在我的freetds.conf中更改它修复了问题。感谢您Vlad提供所有问题排查帮助。