Activerecord,按起始ID的字段排序

时间:2014-04-19 09:54:55

标签: ruby-on-rails activerecord

我正在尝试创建特定查询。

我有一些杂志和一些杂志,在我的观点中,我创造了过去20种杂志的封面流。当我显示一条记录时,我想从该特定记录开始封面流程,保持默认顺序。

我的模特是这样的:

class Magazine < ActiveRecord::Base
 default_scope lambda { order 'number DESC' }
 scope :published, -> { where(visible: true).where 'published_at <= ?', Time.zone.now }
end

和我的控制器&#34;显示&#34;行动是

def show
    #add scope to magazine.all
    @magazine = Magazine.published.find(params[:id])
    @magazines = Magazine.published.limit(20)
    if @magazine.can_show?
      render :show
    else
      not_found
    end
  end

@magazine按编号DESC排序,但我需要引入一个偏移量,起始ID为@ magazine.id。

详细示例

NOW @magazine就是这样:

@magazines = [20,19,18,17,16,14,13,12,11,9,8,7,6,5,4,3,2,1]
@magazine.id = 7

我想用@ magazine.id作为起点。结果必须是:

@magazines = [7,6,5,4,3,2,1]

使用@magazine = 14,结果必须是

 @magazines = [14,13,12,11,9,8,7,6,5,4,3,2,1]

是否有任何命令可以创建这样的范围?

2 个答案:

答案 0 :(得分:0)

您可以通过单行实现:

@magazines.drop(@magazines.index(@magazine.id)) if @magazines.include?(@magazine.id)

示例:

> @magazines
 => [20, 19, 18, 17, 16, 14, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1]
> @magazines.drop(@magazines.index(14))
 => [14, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1]
> @magazines.drop(@magazines.index(7))
 => [7, 6, 5, 4, 3, 2, 1]

答案 1 :(得分:0)

一个班轮,其他方法

@magazines = @magazines.slice(@magazines.index(@magazine.id), @magazines.size) if @magazines.include?(@magazine.id)