Этот вопрос довольно старый, но он все еще высоко ценится в Google в 2019 году, а также некоторые более ранние ответы устарели, поэтому я подумал, что поделюсь возможным решением.
В модель введены некоторые области с проверкой на наличие переданного параметра:
class Post
scope :where_author_ids, ->(ids){ where(author_id: ids.split(‘,’)) if ids }
scope :where_topic_ids, ->(ids){ where(topic_id: ids.split(‘,’)) if ids }
Затем в контроллере вы можете установить столько фильтров, сколько пожелаете, например:
def list
@posts = Post.where_author_ids(params[:author_ids])
.where_topic_ids(params[:topic_ids])
.where_other_condition_ids(params[:other_condition_ids])
.order(:created_at)
Параметр может быть одним значением или списком значений, разделенных запятыми, оба работают нормально.
Если param не существует, он просто пропускает условие where и не фильтрует для этого конкретного критерия. Если параметр существует, но его значение является пустой строкой, он будет «отфильтровывать» все.
Это решение, конечно, не подойдет для любых обстоятельств. Если у вас есть страница просмотра с несколькими фильтрами, но при первом открытии вы хотите показать все свои данные, а не данные, пока не нажмете кнопку «Отправить» или аналогичную (как это сделал бы контроллер), вам придется слегка подправить ее. ,
Я попробовал SQL-инъекцию, и rails, кажется, отлично справляется с обеспечением безопасности всего, насколько я вижу.