Rails动态查找器偶尔不起作用

时间:2013-10-23 07:48:30

标签: ruby-on-rails ruby nomethoderror dynamic-finders

我遇到一个问题,我的Ruby on Rails应用程序中使用的动态查找器几乎总能工作,但很少会抛出NoMethodError。

以下是出现问题时异常堆栈的副本:

2013-10-16 05:34:04.723 [Rails/26343   ] :
NoMethodError (undefined method `find_by_id' for #<Class:0xa972ef8>):
  app/models/sas_ui/supergroup_instance.rb:394:in `event_by_id'
  app/models/trace.rb:73:in `event_by_id'
  app/controllers/tview_controller.rb:102:in `select_event'
  lib/tview_logging_control.rb:22:in `call'

引发异常的代码(supergroup_instance第394行):

event = SasUi::Event.find_by_id(event_db_id)

SasUi :: Event是SasUi的子类,它是ActiveRecord :: Base的子类。

这是数据库条目:

                                         Table "public.events"

   Column   |            Type             |                      Modifiers
------------+-----------------------------+---------------------------------------
 id         | integer                     | not null default nextval('events_id_seq'::regclass)
 sg_inst_id | integer                     | not null
 sas_id     | integer                     | not null
 system_id  | integer                     |
 trail_id   | bigint                      |
 event_id   | integer                     |
 time       | timestamp without time zone |
 sqn        | bigint                      |
 instance   | integer                     |
 data       | bytea                       |
Indexes:
    "events_pkey" PRIMARY KEY, btree (id)
    "index_events_on_sg_inst_id" btree (sg_inst_id)
Foreign-key constraints:
    "events_sg_inst_id_fk" FOREIGN KEY (sg_inst_id) REFERENCES supergroup_instances(id) ON DELETE CASCADE

这有99.99%的时间有效,我们有几百个客户使用这个软件,但很偶然,一个客户看到了这个问题。退出应用程序并重新登录似乎可以解决问题。

访问这些模型的应用程序中有多个线程,这是另一种可供探索的途径。

据我了解,动态查找程序通过覆盖方法缺失方法,并在_字符上拆分被调用方法的名称来提取请求的属性名称。如果提取的属性存在于模型中的attribute_names中,则将进行查询,否则将抛出原始的NoMethodError。

attribute_names具有以下文档:

  

如果列名不是抽象,则返回列名称数组作为字符串   类和表存在。否则返回一个空数组。

除了上面列出的例外情况外,postgres日志或应用程序日志中没有任何暗示性条目。

我最初的想法是可能存在一些间歇性的数据库问题,由于某些原因,postgres报告该表不存在。重新启动应用程序不会重新启动数据库,但确实可以解决问题。

我想知道它是否可以替代铁路缓存表,并且该缓存以某种方式被破坏。

有没有人见过这个或知道会导致这种情况发生的原因? 或者,任何有关任何进一步诊断步骤的建议都将受到赞赏。

我知道这些发现者在最近的版本中已经被弃用了,但是对于这个版本的软件来说,转移到新版本不是一个选项,我想深入了解它,以防它表明更深层次问题。

以下是软件版本/平台:

 - Rails: 3.0.20
 - Ruby: 1.9.2p180
 - Postgres: 9.0.3
 - SunOS <blanked-out> 5.10 Generic_137138-09 i86pc i386 i86pc

添加更多信息,以防原因与自动加载相关:

SasUi::Event - class declaration: class SasUi::Event < SasUi
SasUi::Event - class location on disk: ../app/models/sas_ui/event.rb

There are two other events classes:
Data::Event - class declaration: class Data::Event < ActiveRecord::Base
Data::Event - class location on disk: ../app/models/data/event.rb

Event - class declaration: class Event < DelegateClass(SasUi::Event)
Event - class location on disk: ../app/models/event.rb

1 个答案:

答案 0 :(得分:0)

将模块用作命名空间,而不是类。

你所做的(课堂上的课程)被称为内部课程,不应该在上层阶级之外到达。

Nested classes question.