在我的博客应用中,我可以致电@article.comments.last
。如何创建next_comment
方法,总是选择下一个注释?
更新:
另外,如何反向定义previous_comment
方法?
更新以下答案。
以前的记录:
class Comment < ActiveRecord::Base
def self.previous(comment, key = :id)
self.where("#{key} < ?", commend.send(key)).first
end
end
答案 0 :(得分:3)
要定义&#34; next&#34;,您必须声明排序规则。没有&#34; next&#34;没有订单。
订单可以像主键或其他字段(例如名称)一样简单。以下方法应支持这两种情况,默认为id
&#34;
class Comment < ActiveRecord::Base
def self.next(comment, key = :id)
self.where("#{key} > ?", commend.send(key)).first
end
end
您应该在链上调用它并传递注释实例,以便它可以使用您用来加载原始注释的相同关系
scope = @article.comments
last = scope.last
next = scope.next(last)
另一种(可能更简单的)解决方案是简单地加载两个对象
current, next = @article.comments.take(2)
您也可以将其作为方法
class Comment < ActiveRecord::Base
def self.first_and_next
# use all to create a scope in case you call
# the method directly on the Comment class
all.take(2)
end
end
current, next = @article.comments.first_and_next(2)
答案 1 :(得分:1)
鉴于您有一个分页宝石,如will_paginate
,这将起作用
# Article model
def next_comment
@page ||= 0
@page += 1
comments.page(@page).per(1).first
end
或者如果您不想存储状态
# Comment model
def next_comment
article.comments.where("id > ?", id).first
end
答案 2 :(得分:1)
肮脏的解决方案:
class Comment < ActiveRecord::Base
def next_comment
article.comments.where('id > ?', id).first
end
end