【问题标题】:How do I find the items immediately before and after a specific one in an ordered array, using Ruby on Rails?如何使用 Ruby on Rails 在有序数组中找到特定项目之前和之后的项目?
【发布时间】:2010-07-27 18:45:04
【问题描述】:

我有一个根据投票数排序的“问题”数组,并且想在当前选择的问题之前和之后立即显示问题。

假设当前选择的问题存储在变量@question 中,我将显示与同一用户关联的其他问题的列表。此代码按票数排序:

questions = Question.find(:all, :conditions => {:user => @question.user}).sort { |q1,q2| q2.votes.length <=> q1.votes.length}

现在我如何在该列表中挑选出@question 之前的问题和之后的问题?

【问题讨论】:

  • 你在这里做的事情闻起来很糟糕!如果您有 n 个问题,则需要执行 n+1 个查询以获得问题数组。请了解什么是计数器缓存 - railscasts.com/episodes/23-counter-cache-column - 并使用该列对您的问题进行排序:Question.find(:all, :conditions =&gt; {:user =&gt; @question.user}, :order =&gt; 'votes_count DESC')。或者,您可以加入您的投票模型并添加一个带有count() SQL 函数的列并按它排序。
  • 谢谢,我观看了 railscast,这看起来确实是按票数对问题进行排序的更好方法。但并没有完全解决问题,我仍然不知道如何在该有序数组中定位我当前的问题,并只显示它之前和之后的问题。

标签: ruby-on-rails arrays sorting


【解决方案1】:

更新了我的答案。我想你们会从第一篇文章中得到要点,但这里有一个更详细的例子。

你不能做一些简单的事情吗:

@questions = user.questions.sort_by{ |q| -q.votes.length }
current_question_index = @questions.index(@question)
@prev_question = @questions[current_question_index-1]
@next_question = @questions[current_question_index+1]

行数更多,但只使用简单的数组操作

【讨论】:

  • 您是否需要更多的东西,例如您是否需要一个高效的数据库查询来仅挑选出那些?如果您可以提供数据的性质,也许我可以给您一个特定的查询以获取该信息...?通常你可以做一些事情,比如从当前问题的数量中减去投票的数量,然后将其包装在一个选择中,选择具有最小正面结果或最大负面结果的那个。
  • 删除记录时会失败,你最终可能会得到一组连续的 ID,如 [1,2,4,6,10,11] 使 current_question.id+-1 失败。
  • 这个答案不只是按问题ID排序,而不是按票数排序吗?
  • 成功了!我是 ruby​​-nuby,所以感谢您引导我完成它。
【解决方案2】:

我会参考时间戳。

prev = Question.first(:conditions => ["created_at < ?", @question.created_at], :order => "created_at DESC")
prev = Question.first(:conditions => ["created_at > ?", @question.created_at], :order => "created_at ASC")

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多