我遇到一个问题,我的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