ruby-on-rails - 使用给定对象在数据库中查找下一个 ActiveRecord 模型对象

标签 ruby-on-rails ruby activerecord

我有一个 ActiveRecord 模型对象 @gallery,它代表 Galleries MYSQL 表中的一行。有没有办法让我请求 @gallery 给我表中下一个画廊对象的 ID?

对我来说,最明显的方法是:

@galleries = Gallery.find(:all)
index = @galleries.index(@gallery)

@nextgallery = @galleries[index+1]

但是我必须对此进行 nilsafe,并且我不必要地进行另一个数据库调用来获取所有记录。 还有其他出路吗?

最佳答案

我遇到过类似的情况,最终我得到了几个使用 Rails 3.1.3 的解决方案,其中有类方法或作用域(Rails 2.x 中的 named_scope)。即使没有连续的 ID,这种方法也适用。

使用 Post 模型的类方法示例:

def next
  Post.where("posts.id > ?", self.id).order("posts.id ASC").limit(1)
end

def previous
  Post.where("posts.id < ?", self.id).order("posts.id DESC").limit(1)
end

这可以像这样使用:

post = Post.find(5)

next_post = post.next
 => [#<Post id: 6, ...]

previous_post = post.previous
 => [#<Post id: 4, ...]

对于作用域,使用 lambda 应该是这样的:

  scope :next, lambda { |i| {:conditions => ["#{self.table_name}.id > ?", i.id], :order => "#{self.table_name}.id ASC", :limit => 1} }
  scope :previous, lambda { |i| {:conditions => ["#{self.table_name}.id < ?", i.id], :order => "#{self.table_name}.id DESC", :limit => 1} }

关于ruby-on-rails - 使用给定对象在数据库中查找下一个 ActiveRecord 模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2054164/

相关文章:

ruby-on-rails - 如何从表名中找到模型类?

ruby - Test::Unit 是否仍然与 Rails 相关?

ruby - 为什么 Enumerator 包含 Enumerable

php - 具有事件记录的 Codeigniter MySQL AES?

ruby-on-rails - sqlite3 文件添加到 .gitignore 但仍在修改列表中?

ruby-on-rails - rake 数据库 :seed before db:migrate

database - ActiveRecord 可以在迁移之外创建表吗?

ruby-on-rails - Rails 忽略 config.action_dispatch.x_sendfile_header?使用 Thin + Nginx

ruby-on-rails - Heroku - 错误 H10(应用程序崩溃)Ruby on Rails

ruby-on-rails - 在 Rails 3 和 ActionMailer 中,是否可以使用 TLS over SSL(不是 StartTLS)发送电子邮件?