1

我有一个非常奇怪的问题。我从数据库中获取了一组 Rails ActiveRecord 模型,但集合中的第一个模型没有模型属性/方法,只有标准的 ActiveRecord 基本方法。其余的具有所有属性。它只在我使用Passenger的生产debian服务器上执行此操作。它适用于 OS X 和 cygwin。

有任何想法吗?

谢谢,凯文

4

4 回答 4

0

它可能是您的生产数据库中的错误数据。

我会调高您的日志级别(生产环境不记录 SQL 查询),找到正在生成的查询,然后打开您的生产数据库并运行查询并查看它返回的内容。

于 2009-02-26T00:38:49.243 回答
0

如果不进行一些调试,很难确定这一点,但我可能会考虑调查的一件事是线程问题。我相信 ActiveRecord 会在需要时动态定义这些方法,并且您可能会在访问第一个模型的过程中访问它。Ruby 的“require”语句可能会出现类似的问题——如果您在一个线程中需要某些东西,那么当您尝试在另一个线程中访问它时,该类可能还没有完全定义。

于 2009-02-26T02:22:04.220 回答
0

当您说集合中的第一个模型没有模型属性/方法时,是因为您NoMethodError在尝试调用其中一个时遇到异常吗?

object.methods在您尝试实际调用它们之前,模型对象没有属性方法(例如,在转储 的输出时)是正常的。当您尝试调用有问题的缺失方法之一时,将触发ActiveRecordmethod_missing处理程序,并且如果方法名称与数据库中定义的列之一的名称匹配,则将动态创建该方法并且不会引发异常. 如果这没有发生,要么是因为对象属于错误的类(与您期望操作的模型不匹配),要么是因为插件或 gem 因method_missing处理链中的行为不端而干扰。

您可以将无属性对象实例的 self.class.name 等于的内容转储到日志(logger.info 或 logger.info,具体取决于您的日志级别)中吗?您还可以对安装在生产环境和本地安装的 gem(和相应版本)进行审计吗?

于 2009-02-26T07:44:13.557 回答
0

问题是我不想为 SQL Server 2005 使用正确的 freetds 版本。我使用的旧协议版本不支持超过 30 个字符的列名,这就是它找不到我调用的属性的原因。它被截断了。在我的 freetds.conf 中更改它可以解决问题。感谢Vlad提供的所有故障排除帮助。

于 2009-02-27T19:12:50.070 回答