下一个实例方法

时间:2016-02-07 08:58:49

标签: ruby-on-rails rails-activerecord

在我的博客应用中,我可以致电@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

3 个答案:

答案 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