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”可能是最好的方法。