Подтвердить что ты не робот

Rails "find_all_by" vs ".where"

У меня есть следующий код:

def maturities
  InfoItem.find_all_by_work_order(self.work_order).map(&:maturity)
end

Я думал об изменении его:

def maturities
  InfoItem.where(work_order: self.work_order).map(&:maturity)
end

Будет ли это преимущество? Похоже, что .where чаще встречается, чем find_all_by.

4b9b3361

Ответ 1

Мое мнение таково, что использование .where - лучший подход.

Когда вы используете искатели, основанные на атрибутах, вам придется проложить туннель через метод, отсутствующий в вызове, и в конечном итоге определить метод класса через class_eval, который возвращает ваш результат. Это дополнительная обработка, которую вам, возможно, не нужно делать.

Кроме того, наложение строк: find_by_this_and_this_and_this_and_this... может стать уродливым.

Посмотрите, как рельсы выполняют поиск на основе атрибутов здесь

Метод отсутствует в модуле DynamicMatchers на github:

def method_missing(name, *arguments, &block)
  match = Method.match(self, name)

  if match && match.valid?
    match.define
    send(name, *arguments, &block)
  else
    super
  end
end

Ответ 2

Я считаю, что основным преимуществом является возможность добавления дополнительных критериев в то, где find_all_by ограничивается полем динамического селектора. Если у вас есть только одно условие, которое вы ищете, то я думаю, что это стирка, но когда вы начинаете добавлять 3 или 4, динамические искатели могут быть уродливыми. Хэши приятно смотреть, и вы можете передать хэш условий в качестве параметра, если это необходимо. Динамические искатели классные, но я думаю, что весы более чистым способом и более читабельны.