【问题标题】:Rails - Model Namespace And Folder Structure For InheritanceRails - 用于继承的模型命名空间和文件夹结构
【发布时间】:2014-05-05 04:08:00
【问题描述】:

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

我有一个对应于 db 表的 rails 模型(传输)。导入和导出是传输类型,是传输类固有的。还有一些中间类定义了该层次结构通用的代码。

这是当前的设置方式:

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  
...  

这里有一些类 sn-ps:

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  

【问题讨论】:

  • 对于命名空间我使用module 而不是classrails/ruby 很好理解,这很有帮助。

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


【解决方案1】:

类似于Зелёный 所说的,我认为所有的 Transport 类都应该被命名为一个模块。

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

# 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 和 Metric 是什么以及它们在导入和导出中的作用。

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多