Я кодирую свою собственную ERP. Для People
(класса модели) у меня есть следующие проверки:
class People < ApplicationRecord
# some code for N:M relations
# validations
validates :aka, presence: { if: proc { |person| person.aka? } },
uniqueness: true,
length: { within: 3..25,
if: proc { |person| person.aka? } }
validates :last_name, presence: { if: proc { |person| person.last_name? } },
uniqueness: { scope: %i[last_name first_name] },
length: { within: 2..100,
if: proc { |person| person.last_name? } }
validates :phone_ext, presence: { if: proc { |person| person.phone_ext? } },
length: { within: 1..10,
if: proc { |person| person.phone_ext? } },
format: { with: /\A\d{1,10}\Z/i,
if: proc { |person| person.phone_ext? } }
validates :first_name, presence: true,
uniqueness: { scope: %i[last_name first_name] },
length: { within: 2..100 }
end
Как вы можете видеть во всех строках if: proc { ....
, они почти одинаковы. И быстрее знает об этом, поэтому я получаю сообщение Вызов методов без аргументов внутри блоков медленнее, чем использование символа для обработки.
Теперь, безуспешно, весь день я пытаюсь найти выход, чтобы решить это сообщение Фастерера. Я пробовал лямбды, замыкания, &:, ->, поэтому я сдаюсь.
Любые идеи?
Это относится, например, к тому, что a.map(&:foo)
быстрее, чем a.map { |o| o.foo }
.
В этом контексте validates
примет имя метода для проверки в качестве символа. Например, if: :aka?
вместо if: proc { |person| person.aka? }
Сработало, ОТЛИЧНО, спасибо