Подтвердить что ты не робот

Как указать Rails 3 scope.limit - со смещением?

Итак, у меня есть несколько сообщений и вы хотите показать n..m самые последние записи на боковой панели (эти числа задаются в конфиге)

Я могу получить последние n записей достаточно легко

class Post < ActiveRecord::Base
  default_scope :order => "created_at DESC"
  scope :published, lambda { where("blog_entries.created_at <= ?", Time.zone.now) }
  scope :latest, lambda { |n| published.limit(n) }
end

@posts = Post.latest(6)

Но мне хотелось бы

@posts = Post.published.limit(6, 12)

но это дает wrong number of arguments, так есть ли какой-либо способ в AR? Прямо сейчас я играю с will_paginate, но, похоже, он использует его для этого.

4b9b3361

Ответ 1

Хорошо, так что ответ, я думаю:

@posts = Post.published.limit(6).offset(5)

Получит 6 постов, начиная с шестого.


edit2: насчет лимита ([6, 12]), я нахожу это странным:

attr_accessor :limit_value

def limit(value)
  relation = clone
  relation.limit_value = value
  relation
end


def build_arel
    ...
    arel.take(connection.sanitize_limit(@limit_value)) if @limit_value
    ...
end


def sanitize_limit(limit)
    if limit.is_a?(Integer) || limit.is_a?(Arel::Nodes::SqlLiteral)
      limit
    elsif limit.to_s =~ /,/
      Arel.sql limit.to_s.split(',').map{ |i| Integer(i) }.join(',')
    else
      Integer(limit)
    end
  end

Так что я не вижу, как это работает с массивом. Но я явно что-то упустил. Вы видите что?

Ответ 2

Для рельсов 5 (не обязательно для рельсов 4). offset(x).limit(y) работает правильно. limit(y).offset(x) все еще ведет себя так, как описано в других ответах.