【问题标题】:Finding the next record in the database with Active Record使用 Active Record 查找数据库中的下一条记录
【发布时间】:2011-11-20 01:27:38
【问题描述】:

所以我有我的 Rails 应用程序,并且我的应用程序中有博客文章。 对于初学者,我使用的是 rails 2.3.5 和 Ruby 1.8.7

对于显示页面,我需要提供上一个/下一个博客文章的上一个/下一个链接。

问题是我需要找到数据库中语言列等于“eng”的下一篇博客。我已经开始在我的模型中写出它并且它可以工作,但是当然这只会在数据库中找到上一个/下一个记录,无论在列中指定什么语言,当找不到记录时它会中断。

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

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

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

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

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

    【讨论】:

    • 小心 - 您的 prev 函数将始终返回数据库中的第一条记录 :)
    • 如果id没有排序怎么办?
    • 然后你可以按created_at 或类似的东西排序。如果您根本没有要排序的内容,您可能可以玩弄限制和偏移量。
    【解决方案2】:

    像这样进行 id 数学运算通常很危险,因为您无法保证它存在。例如,假设您有 id 为 1、2 和 3 的记录,然后您删除记录 3 但创建一个新记录,ActiveRecord 会将其分配给 4(即使 3 不再是记录。所以如果您要执行find(self.id + 1) 在记录 2 上,你会收到一个错误。

    最简单的方法可能是使用“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).last
    end
    

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

    【讨论】:

    • 嘿大卫,我明白你在说什么,你是绝对正确的。我写的是我想做的逻辑的一个简单粗略的想法。我正在写的是 Rails 2.3 而不是 Rails 3。
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2015-01-04
    • 2011-12-20
    相关资源
    最近更新 更多