1

我被 Rail 自动加载丢失的常量给宠坏了。在 Ruby 中,如果我有两个类,一个嵌套在另一个内部但在不同的文件中,我如何要求它们,因为它们相互依赖(循环依赖)。

# user.rb
class User < ActiveRecord::Base
   serialize :preferences, User::Preferences
end

# user/preferences.rb
class User::Preferences
end

# user_spec.rb    
require 'user'
require 'user/preferences'

注意:我不需要Rails 环境。

如果我先尝试加载用户,代码会失败,因为它还不知道User::Preferences。如果我首先加载“用户/首选项”,它会在加载用户时失败,因为现有的用户类不是 ActiveRecord 的子类。

我怀疑我需要删除循环依赖,或者如果可能的话, 通过传递一个在需要时变成常量serialize的字符串来延迟加载类。'User::Preferences'

4

2 回答 2

2

我的一个技巧是在 user/preferences.rb 中创建一个从 ActiveRecord::Base 继承的空 User 类:

class User < ActiveRecord::Base; end

class User::Preferences
end
于 2013-04-01T00:27:35.187 回答
0

您可以将存根声明放在一个公共基础中,而不是将User's 实现的知识连接到您中,如下所示:User::Preferences

# user_base.rb
class User < ActiveRecord::Base; end

# user.rb
require 'user_base'
require 'user/preferences'

class User
   serialize :preferences, User::Preferences
   ...
end

# user/preferences.rb
require 'user_base'

class User::Preferences
end

或者,您可以移动User::Preferences到独立的模块命名空间,例如ModelHelper::User::Preferences. 我想我更喜欢这个解决方案。您有循环依赖的事实是代码异味,唯一导致它的原因是将User类重用为User::Preferences.

于 2013-04-01T00:49:02.210 回答