2014-02-09 5 views
0

в моем проекте с рельсами. Я хочу загрузить несколько «источников», в зависимости от настроенных методов исследования. Для исследования пользователь настраивает, какие методы он хочет использовать, эта информация доступна в контроллере как массив строк. С другой стороны есть источники, которые настроены админами, для каждого источника, который мы говорим, для каких исследований полезен источник.Проверьте, задано ли поле из массива строк

Эти источники:

# == Schema Information 
# 
# Table name: sources 
# 
# id    :integer   not null, primary key 
# title   :string(255) 
# url   :string(255) 
# WebSearch  :boolean 
# DatabaseSearch :boolean 
# LibrarySearch :boolean 
# Interview  :boolean 

@sources = Source.all 

Для булевых полей существуют соответствующие модели с точно таким именем. В контроллере я прочитал активированные методы таким образом:

@categories << @question.research_categories.detect{|c| c == params[:type]} 

=> @categories = ["WebSearch", "Interview"] 

То, что я хочу сделать что-то вроде «Source.where (@categories =?)» И получить только источники с именами, содержащимися в @ категории.

+1

он собирается быть условием ИЛИ? смысл в том, что если одна из категорий имеет истинное значение в столбце? – emaillenin

+0

Хорошая точка от @emaillenin, мой ответ должен был бы немного отличаться, если обязательно, чтобы столбцы, не включенные в '@ category', были ложными. –

+0

- это число категорий, которое будет расти в будущем, или будет всегда 4? – emaillenin

ответ

1

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

Для примера вам нужно будет в итоге получить

.where(WebSearch: true, Interview: true) 

из

@categories = ["WebSearch", "Interview"] 

так все, что вам нужно сделать, это отобразить массив в такой хэш:

Hash[@categories.map{|v|[v, true]}] 

Лучше всего было бы объединить это с scope.

class Source < ActiveRecord::Base 
    scope :with_categories, ->(categories) { where(Hash[categories.map{|v|[v, true]}]) } 
end 

должен работать (не проверено) и позволяют писать:

Source.with_categories(@categories) 
+0

Это работает отлично, спасибо :) –

0
Source.joins(:research_categories) 
     .where("research_categories.name in (:names)", names: @categories) 
Смежные вопросы