Как указать 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
, но, похоже, он использует его для этого.
Ответы
Ответ 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)
все еще ведет себя так, как описано в других ответах.