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