Ruby MyClass = Class.new自动加载最佳实践

时间:2017-03-03 03:56:02

标签: ruby-on-rails ruby

我有这样定义的类,我被告知这可能会导致Rails自动加载问题。这背后的原因是什么?我们什么时候应该使用Class.new?

class Integration < ActiveRecord::Base
  MYobIdentifier = Class.new(Integration)
end

2 个答案:

答案 0 :(得分:1)

由于评论中链接的stackoverflow问题涵盖,

class A
  class B
  end
end

引起了人们的注意:

A = Class.new do
  B = Class.new
end

您的示例的另一个细节是另一个类Integration作为参数传递给Class.new。这设置了继承。您可以使用ClassA < ClassB检查一个类是否继承自另一个类;这会返回truenil

class A
  class B
  end
end
A::B < A
# => nil

class A
  B = Class.new(A)
end
A::B < A
# => true

这第二个例子与此相同:

class A
  class B < A
  end
end
A::B < A
# => true

答案 1 :(得分:1)

如果找不到常量(在这种情况下是您的类名),那么Ruby将尝试使用基于常量名称的文件名来查找它。在这种情况下,它将在名为select ( select ( select id from billing where plan_id <> 1 and id < b2.id order by id desc limit 1 ) from billing b2 where plan_id = 1 and id < b1.id order by id desc limit 1 ) from billing b1 order by id desc limit 1 的文件中搜索ERROR: This type of correlated subquery pattern is not supported due to internal error (此文件会有几个不同的位置)

只要您确定在对MYobIdentifier进行任何尝试之前已加载m_yob_identifier类,那么它将始终定义,您无需担心。

同样在您的情况下,我假设您将以Integration的形式访问它,在这种情况下{I}将始终加载MYobIdentifier,然后再尝试解析常量。

注意:我认为你最好将课程资本化为Integration::MYobIdentifier