Rails, как связать области с оператором "и" между ними?

У меня есть область, которая выглядит так:

scope :attr_similar_to, -> (attr, strings) { where("#{attr} similar to ?", "%(#{strings})%") }

То, как я использую эту область видимости, заключается в том, чтобы выполнить итерацию по ряду атрибутов, и для каждого атрибута я отправляю атрибут в область видимости вместе с набором нескольких строк в переменной 'strings', которая отправляется в эту область видимости как "foo | bar | и т.д.". Поэтому для каждого атрибута я проверяю, является ли значение атрибута аналогичным какой-либо из строк.

Цикл, в котором я использую эту область видимости, выглядит следующим образом:

results = Model.none
attributes.each do |attr|
  results += attr_similar_to(attr, strings)
end

Проблема в том, что если у меня есть два атрибута, "name" и "age", и только "name" совпадает с "foo", он все равно извлечет все те записи, которые соответствуют "foo". Я хочу иметь возможность связывать эти вызовы области с чем-то вроде оператора "и" между ними, так что, например, и "имя", и "возраст" должны получать совпадение, чтобы получить любые записи.

Возможно, я пытаюсь сделать это неправильно или неэффективно?

1 ответ

Решение
results = Model.all    # Model.scoped in rails 3

attributes.each do |attr|
  results = results.attr_similar_to(attr, strings)
end

Или более кратко:

results = attributes.inject(Model.all) do |result, attr| 
  result.attr_similar_to(attr, strings)
end
Другие вопросы по тегам