gpt4 book ai didi

ruby-on-rails - Rails 动态查找器有时不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:35 26 4
gpt4 key购买 nike

我有一个问题,我的 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 line 394):

event = SasUi::Event.find_by_id(event_db_id)

SasUi::Event 是 SasUi 的子类,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 具有以下文档:

Returns an array of column names as strings if it’s not an abstract class and table exists. Otherwise it returns an empty array.

postgres 日志或应用程序日志中没有提示条目,除了上面列出的异常。

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

我想知道它是否可以替代地归结为 rails 缓存表,并且该缓存以某种方式被破坏。

有没有人以前见过这种情况或知道是什么导致这种情况发生?或者,如有任何关于进一步诊断步骤的建议,我们将不胜感激。

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

以下是软件版本/平台:

 - 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

最佳答案

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

你所做的(class under class)叫做inner class,不应该在upper class之外接触到。

Nested classes question.

关于ruby-on-rails - Rails 动态查找器有时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19535825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com