我有一个 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/