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

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

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

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

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


person Majoren    schedule 21.10.2014    source источник


Ответы (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
person BroiSatse    schedule 21.10.2014
comment
Итак, хотя это отлично решило проблему, как бы это выглядело, если бы вы хотели, чтобы это было связано с операторами «ИЛИ»? - person Majoren; 21.10.2014
comment
@Majoren Это другой вопрос, поэтому создайте для него новую тему. - person simonwo; 21.10.2014
comment
@simonwo stackoverflow.com/questions/26489531/ - person Majoren; 21.10.2014