我有一个需要从辅助源加载外部数据的模型.存在许多Web服务,我的模型可以从(可交换)获取数据,但是我不想创建将难以更改服务的代码(成本根据可变和固定使用而显着不同,并且可能会更改将被要求).
我想创建一个驱动程序来执行交互(然后再创建进一步的定制驱动程序,如果服务需要切换).不幸的是,由于驱动程序和模型的紧密耦合,将代码提取到插件或宝石中是没有意义的.我已将所有的代码提取到一个模块中(参见示例),目前我的模型已经声明了.
module Synchronize def refresh self.attributes = ... self.save end end class Data < ActiveRecord::Base include Synchronize end
Rails(3.0.0)是否存储与模型紧密耦合的模块?我应该使用插件来做这个吗?这与“app / helpers”目录有关吗?如果没有,最适合存储代码的地方在哪里?谢谢!
解决方法
你是正确的,如果模块紧密耦合到特定的模型,那么它不是宝石/插件的好候选人.
app / helpers /用于查看辅助方法,不应包含仅用于混合到模型中的模块.
你可以把这个模块的一个地方放在lib /里.这是代码,它不适合应用程序内的任何地方,通常是移动到插件之前松散耦合代码的初始位置(但这不是一个艰难和快速的规则).但是,由于您的模块与您的模型紧密耦合,因此lib /可能不是最佳选择.
我知道37信号(和其他人)使用“关注”的概念作为在模块中组织的相关模型代码的一种方式.这是通过创建应用程序/关注/将模块放在那里来实现的.然后将该目录添加到config / application.rb(Rails 2的config / environment.rb)中的应用程序的加载路径中:
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
希望有帮助.