Для примера, который вы привели, я был бы явным, и собрал вместе области видимости, чтобы создать нужный запрос:
scope = Post
scope = scope.random if params[:scope] == 'random'
@posts = scope.find(:all, ...) # or paginate or whatever you need to do
Если params [: scope] не является 'random', это то же самое, что вызов Post.find (), в противном случае он выполняет Post.random.find ()
Из одного из других ответов похоже, что find_by_filter сделает для вас почти то же самое.
Используя этот шаблон, вы также можете объединить несколько областей в запрос, если вам нужно было поддерживать вещи, которые не были взаимоисключающими
например
scope = scope.only_monsters if params[:just_monsters] == 1
scope = scope.limit(params[:limit].to_i) unless params[:limit].to_i.zero?
Так что GETting / posts? Scope = random & just_monsters = 1 & limit = 5 даст вам:
Post.random.just_monsters.limit(5).find(:all, ...)