ruby 中的两个文件相互要求

Two files requiring each other in ruby

我正在用 Ruby 和 Grape 构建网络 API。我有两个 classes 需要彼此,这导致我遇到未初始化常量 class 错误的情况。我得到错误的地方是在连接器的实体 class 中,请参见下面的示例代码,它在初始化之前需要 Card::Entity。有没有办法在不将实体定义移动到另一个文件的情况下解决这个问题?

#card.rb
require_relative 'connector'
require_relative 'caption'

class Card < ActiveRecord::Base

  belongs_to  :medium
  belongs_to  :storyline

  has_many    :connectors, autosave: true
  has_many    :connected_cards, class_name: "Connector", foreign_key: "connected_card_id"
  has_many    :captions

  accepts_nested_attributes_for :connectors, :captions

  class Entity < Grape::Entity
    expose :id, documentation: { readonly: true }
    expose :cardtype
    expose :connectors, using: Connector::Entity
    expose :captions, using: Caption::Entity
  end
end

#connector.rb
require_relative 'card'

class Connector < ActiveRecord::Base
  has_one  :card
  has_one  :connected_card, :class_name => "Card", :foreign_key => "connected_card_id"

  class Entity < Grape::Entity
    expose :id, documentation: { readonly: true }
    expose :title
    expose :card, using: Card::Entity
    expose :connected_card, using: Card::Entity
  end
end

我不太了解葡萄,但这可以通过 "pre declaring" class:

解决
#card.rb
require_relative 'caption'

class Connector < ActiveRecord::Base
  # empty declaration just to make the import works
end

class Card < ActiveRecord::Base
  belongs_to  :medium
  belongs_to  :storyline

  has_many    :connectors, autosave: true
  has_many    :connected_cards, class_name: "Connector", foreign_key: "connected_card_id"
  has_many    :captions

  accepts_nested_attributes_for :connectors, :captions
  ...
end

不过,我认为 QPaysTaxes 在这里的设计可能有一个有效的观点。