Rails - 继承的模型命名空间和文件夹结构

时间:2014-03-26 15:50:44

标签: ruby-on-rails ruby model namespaces directory

我试图了解设置模型文件夹的正确方法。我遇到了一些名称解析冲突。

我有一个与db表对应的rails模型(transport)。进口和出口是运输类型和运输类固有的。还有中间类定义了该层次结构的共同代码。

以下是目前的设置方式:

models/  
models/transport.rb  
models/transport/  
models/transport/import.rb  
models/transport/import/  
models/transport/import/api.rb  
models/transport/import/api/  
models/transport/import/api/metric.rb  
models/transport/import/api/order.rb  
models/transport/import/csv.rb  
models/transport/import/csv/  
models/transport/import/csv/metric.rb  
models/transport/import/csv/order.rb  
models/transport/export/  
models/transport/export/api.rb  
...  

以下是一些课程片段:

models/transport.rb
class Transport < ActiveRecord::Base
  # common transport code
end

models/transport/import.rb    
class Transport  
  class Import < Transport  
    # common import code  
  end  
end  

models/transport/import/api.rb
class Transport
  class Import
    class Api < Transport::Import
      # common api code
    end
  end
end

models/transport/import/api/metric.rb
class Transport
  class Import
    class Api
      class Metric < Transport::Import::Api
        # metric code
      end
    end
  end
end

问题:组织rails模型文件夹/命名空间的正确方法是什么?

特别是当您继承功能而不是通过内部命名空间扩展功能时。

当前代码有错误,因为ruby认为它继承了它的外部类。我想过使用基础文件夹来避免争用,但是想要了解其他人在类似情况下会做些什么。

models/  
models/base/    
models/base/transport.rb  
models/transport/  
models/transport/import.rb  
models/transport/import/  
models/transport/import/api.rb  

1 个答案:

答案 0 :(得分:0)

Зелёный所述类似,我认为所有的传输类都应该被命名为模块。

所以它看起来像以下(不是我的建议):

# models/transport.rb
module Transport
  # common transport code
end

# models/transport/import.rb    
module Transport  
  module Import 
    # common import code  
  end  
end  

# models/transport/import/api.rb
module Transport
  module Import
    module Api
      # common api code
    end
  end
end

# models/transport/import/api/metric.rb
module Transport
  module Import
    module Api
      class Metric < ActiveRecord::Base
        # metric code
      end
    end
  end
end

我不建议将类放在类中。这让人感到困惑。看起来你有一个可以导入或导出的传输模型。我不确定他们之间的区别是什么,除了一个人可能发送和一个人可能收到。如果这就是我不会使文件夹结构如此复杂。

也许就像这样:

# models/transport.rb
module Transport
  # Stuff that import and export both need, that isn't instance specific
end

# models/transport/import.rb    
module Transport  
  class Import < ActiveRecord::Base
    # common import code  
  end  
end  

# models/transport/export.rb    
module Transport  
  class Export < ActiveRecord::Base
    # common export code  
  end  
end

为了帮助提供更好的答案,我认为我们需要更好地了解API和指标是什么以及它们如何在导入和导出中发挥作用。