代码之家  ›  专栏  ›  技术社区  ›  Kevin Sylvestre

Rails应用中的模块化建模

  •  13
  • Kevin Sylvestre  · 技术社区  · 14 年前

    我有一个需要从辅助源加载外部数据的模型。我的模型可以从许多web服务中获取数据(可交换),但我不想创建代码,因为这些代码会使更改服务变得困难(根据可变和固定的使用情况,成本会有很大差异,可能需要更改)。

    我想创建一个驱动程序来执行交互(如果服务需要切换,那么再创建更多的自定义驱动程序)。不幸的是,由于驱动程序和模型的紧密耦合,将代码提取到插件或gem中是没有意义的。我已经将所有代码提取到一个模块中(参见示例),并且当前在我的模型上面声明了代码。

    module Synchronize
      def refresh
        self.attributes = ...
        self.save
      end
    end
    
    class Data < ActiveRecord::Base
      include Synchronize
    end
    

    Rails(3.0.0)是否有存储与模型紧密耦合的模块的约定?我应该用插件来做这个吗?这是否与“app/helpers”目录关联?如果没有,最适合在哪里存储代码?谢谢!

    2 回复  |  直到 14 年前
        1
  •  27
  •   Sidane    14 年前

    如果模块与特定模型紧密耦合,那么它就不是gem/插件的好候选,这是正确的。

    我知道37signals(和其他)使用“关注点”的概念,将相关模型代码组织在模块中。这是通过创建app/关注点/并将模块放在其中来实现的。然后在config中将该目录添加到应用程序的加载路径中/应用程序.rb(配置/环境.rb对于轨道2),带有:

    config.load_paths += %W(#{Rails.root}/app/concerns)
    

    然后该模块可以像正常情况一样混合到模型中。

    以下是Jamis Buck关于这一点的原始博客文章- http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

    http://github.com/jakehow/concerned_with

    希望有帮助。

        2
  •  2
  •   Pete Brumm    13 年前

    这个链接帮助我解决了这个问题。

    http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

    我一直把它放在model/extensions目录中。关注目录是有道理的,但是“关注”这个词对我来说并不明显。也许我会喜欢它。

    我还将扩展路径添加到应用程序.rb

    config.autoload_paths += %W(#{config.root}/app/models/extensions)