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
.
Ответы
Ответ 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, динамические искатели могут быть уродливыми. Хэши приятно смотреть, и вы можете передать хэш условий в качестве параметра, если это необходимо. Динамические искатели классные, но я думаю, что весы более чистым способом и более читабельны.