如何让模块能够扩展ActiveRecord :: Base的功能

时间:2013-11-18 20:23:07

标签: ruby-on-rails

我的一个名为global_list的类正在过度生长,我想将它分解为一个名为GlobalListAggregate的模块。我想使用一组find_by_sql方法(是的,我稍后会重构)但需要先将它们移出global_list。

我喜欢类似的东西(显然sql查询要比这复杂得多):

module GlobalListAggregate < ActiveRecord::Base
  def self.get_users
    sql="select * from users"
    users=find_by_sql([sql])
  end
end

但是模块不能以这种方式扩展。我怎么能做到这一点?

THX

3 个答案:

答案 0 :(得分:0)

Rails中流行的模式是“关注点”,它基本上是扩展ActiveSupport::Concern的模块,它为这类事物添加了一些语法糖(特别是在扩展类上定义类方法)更容易一些。该链接的文档以及the answers to this SO question非常有启发性。

答案 1 :(得分:0)

我还没有真正理解关注,所以另一个答案可能是最好的,但我会说,如果我理解你的目标,你应该能够做到:

module GlobalListAggregate
  def get_users
    sql="select * from users"
    users=find_by_sql([sql])
  end
end

然后在extend GlobalListAggregate课程中添加GlobalList

答案 2 :(得分:0)

假设你的用法是这样的

GlobalListAggregate.get_users.each { |user| puts user.id }

这有点作弊,不确定如果我推荐它

module GlobalListAggregate 
  def self.klass
    User
  end

  def self.get_users
    sql="select * from users"
    klass.find_by_sql([sql])
  end
end