Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 正在使用活动记录查找数据库中的下一条记录_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 正在使用活动记录查找数据库中的下一条记录

Ruby on rails 正在使用活动记录查找数据库中的下一条记录,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,所以我有我的rails应用程序,我的应用程序中有博客文章。 首先,我使用的是rails 2.3.5和Ruby 1.8.7 对于show页面,我需要提供一个指向prev/next博客文章的prev/next链接 问题是我需要找到下一个博客,其中数据库中的language列等于'eng'。我已经开始在我的模型中写出来了,它可以工作,但是当然,无论列中指定了什么语言,它都会在数据库中找到上一条/下一条记录,当找不到记录时,它就会中断 def next(lang='eng') BlogEntry.fi

所以我有我的rails应用程序,我的应用程序中有博客文章。 首先,我使用的是rails 2.3.5和Ruby 1.8.7

对于show页面,我需要提供一个指向prev/next博客文章的prev/next链接

问题是我需要找到下一个博客,其中数据库中的language列等于'eng'。我已经开始在我的模型中写出来了,它可以工作,但是当然,无论列中指定了什么语言,它都会在数据库中找到上一条/下一条记录,当找不到记录时,它就会中断

def next(lang='eng')
 BlogEntry.find(self.id - 1)
end

def prev(lang='eng')
 BlogEntry.find(self.id + 1)
end

试试这个。这不会打破丢失的记录

BlogEntry.find(:first, :conditions => ["id > ? AND lang = ?", self.id, lang])

BlogEntry.find(:first,:conditions=>[“id<?AND lang=?”,self.id,lang])

像这样做id数学通常是危险的,因为你不能保证它存在。例如,假设您有id为1、2和3的记录,然后删除记录3,但创建一个新记录,ActiveRecord会将该记录分配给is 4(即使3不再是记录)。因此,如果要对记录2执行查找(self.id+1),您将收到一个错误

最简单的方法可能是使用“where”语句

def next(lang='eng')
    BlogEntry.where(:lang => lang).where("id > ?", self.id).first
end

def prev(lang='eng')
BlogEntry.where(:lang=>lang).where(“id<?”,self.id).最后
终止

我不熟悉您正在使用的Rails版本的语法,但如果不相同,它可能非常相似。

小心-您的prev函数将始终返回数据库中的第一条记录:)如果
id
未排序,怎么办?然后您可以在
处创建的
或类似的东西上排序。也许,如果你根本没有什么可排序的,你可以玩弄极限和偏移量。嘿,大卫,我明白你的意思,你是绝对正确的。我写的只是我想做的逻辑的一个简单粗略的想法。我写的是Rails2.3而不是Rails3。
def next(lang='eng')
    BlogEntry.where(:lang => lang).where("id > ?", self.id).first
end
def prev(lang='eng')
    BlogEntry.where(:lang => lang).where("id < ?", self.id).last
end