Ruby on rails 如何使Ruby模块动态化?

Ruby on rails 如何使Ruby模块动态化?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有四种型号,用户,个人资料,徽章,以及会员, 具有几乎相同的previous和next方法。以下示例来自我的用户模型 def next self.class.find :first, :conditions => [ "created_at > ? AND user_id = ?", self.created_at, self.user_id ],

我有四种型号,
用户
个人资料
徽章
,以及
会员
, 具有几乎相同的
previous
next
方法。以下示例来自我的
用户
模型

def next
  self.class.find :first, 
                  :conditions => [ "created_at > ? AND user_id = ?",
                                   self.created_at, self.user_id ], 
                  :order => "created_at ASC"
end

def previous
  self.class.find :first, 
                  :conditions => [ "created_at < ? AND user_id = ?",
                                   self.created_at, self.user_id ], 
                  :order => "created_at DESC"
end
def next
self.class.find:首先,
:conditions=>[“创建时间>>和用户id=?”,
self.created_at,self.user_id],
:order=>“在ASC创建”
结束
def先前版本
self.class.find:首先,
:conditions=>[“创建时间<”和用户id=?”,
self.created_at,self.user_id],
:order=>“在描述时创建”
结束
我尝试将这些方法放入一个外部模块
Extensions::Utility
,这样每个模型都可以
包含Extensions::Utility

实现此方法的最佳方法是什么,以便它支持动态替换
用户
,以替换其他模型


我的环境是Ruby/Rails 3.0.6。

Tilo的回答有道理。我将方法
next
更改为
nekst

module Extensions
  module Utility
    def id; "#{self.class.downcase}_id" end

    def nekst
      self.class.find :first, 
                      :conditions => [ "created_at > ? AND #{id} = ?",
                                       self.created_at, self.send(id) ], 
                      :order => "created_at ASC"
    end

    def previous
      self.class.find :first, 
                      :conditions => [ "created_at < ? AND #{id} = ?",
                                       self.created_at, self.send(id) ], 
                      :order => "created_at DESC"
    end
  end
end
模块扩展
模块实用程序
def id;“#{self.class.downcase}u id”结束
def nekst
self.class.find:首先,
:conditions=>[“created_at>和#{id}=?”,
self.created_at,self.send(id)],
:order=>“在ASC创建”
结束
def先前版本
self.class.find:首先,
:conditions=>[“在<?和{id}创建”,
self.created_at,self.send(id)],
:order=>“在描述时创建”
结束
结束
结束
请注意,在Ruby语言中,“next”是一个关键字


我建议不要定义任何名称属于Ruby语言一部分的方法。

像user_id这样的列名是否总是与像user这样的模型名相对应?这是一个很好的解决方案,但是
nekst
是一个糟糕的方法名。:)说得好。将它们重命名为“previous/successing”可能是最好的方法。