2013-04-04 3 views
2

У меня есть следующий зачаточной кусок кода в моей модели, чтобы вернуть случайное событие:Rails/ActiveRecord - найти N случайных элементов

def self.random 
    Event.first(:offset => rand(Event.count)) 
end 

Я хотел бы изменить функцию так, она возвращает N число Мероприятия.

Я знаю, что first может принимать число в качестве параметра, то есть Event.first(2), но как его сочетать со случайным смещением?

I.e. что-то вроде этого

def self.random(n = 1) 
    Event.first(n) # and offset??!! 
end 

Любая помощь будет оценена!

+0

Смотрите также [Случайная запись в ActiveRecord] (http://stackoverflow.com/questions/2752231/random-record-in-activerecord). В частности, я предпочитаю использовать жемчужину [randumb] (https://github.com/spilliton/randumb). –

ответ

2

Хотя метод Стюарт работает сам по себе, он не может быть привязан ко многим другим областям ActiveRecord. Я нашел другой способ (с использованием смещения), который работает с цепочкой:

def self.random(number = 1) 
    Event.offset(rand(Event.count - number+1)).first(number) 
    end 
2

Это должно работать для возвращения n случайных записей:

def self.random(n = 1) 
    Event.order("RANDOM()").limit(n) 
end 

Метод limit фактически вызывается first, когда вы даете ему Integer в качестве первого аргумента, так что вы можете также использовать .first(n) вместо .limit(n) если вы предпочитают.

Возможно, вам потребуется заменить RAND() вместо RANDOM() в зависимости от вашей системы баз данных, обратитесь к документации для точного метода.

Смежные вопросы