Разрешить пользователю выбирать именованную область с помощью параметров GET - PullRequest
0 голосов
/ 18 мая 2009

В моей модели сообщений у меня есть именованная область:

named_scope :random, :order => "Random()"

Я хотел бы дать пользователям возможность получать сообщения в произвольном порядке, отправив запрос GET с params[:scope] = 'random'.

Если не считать eval("Post.#{params[:scope]}"), как я могу это сделать?

Ответы [ 5 ]

2 голосов
/ 18 мая 2009

Я бы предложил мой очень классный плагин Act_S_Filter, предназначенный для пользовательской фильтрации результатов через named_scopes.

http://github.com/tobyhede/acts_as_filter/tree/master

Eval подходит для использования, но убедитесь, что вы проверяете по принятым / ожидаемым значениям (я часто просто подключаю некоторые значения в массив и проверяю accept_values.include? (Параметр))

2 голосов
/ 18 мая 2009

eval - довольно плохая идея. Тем не менее, #send идеально подходит для этого - он по своей сути безопаснее и быстрее, чем eval (насколько я понимаю).

Product.send(params[:scope])

Это должно сделать это:)

1 голос
/ 22 января 2010

Я наткнулся на это в поиске. searchlogic идеально подходит для этого.

1 голос
/ 18 мая 2009

Я бы держался подальше от eval, поскольку вы имеете дело с данными, поступающими от пользователя. Может быть, просто использовать простое утверждение дела? Таким образом, вы сможете проверить, какие данные они вам предоставляют.

0 голосов
/ 19 мая 2009

Для примера, который вы привели, я был бы явным, и собрал вместе области видимости, чтобы создать нужный запрос:

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, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...