Не работает do end в многострочном блоке lambda
Всем привет! У меня есть scope, который содержит следующий код:
scope :tests_by_category, lambda { |category_name|
joins(:category)
.where(categories: { title: category_name })
.order(title: :desc)
}
В чем проблема: когда я хочу заменить фигурные скобки на do..end, конкретно:
lambda do |category_name|
joins(:category)
.where(categories: { title: category_name })
.order(title: :desc)
end
lambda "теряет" блок, и выдает ошибку
Если написать не lambda, а ->(category_name) do...end, то все работает исправно, но в таком случае ругается рубокоп на то, что для многострочных блоков необходимо исправить -> на lambda. Подскажите, почему вообще лямбда "теряет" блок и можно ли это как-нибудь исправить?
Ответы (1 шт):
Автор решения: Василиса
→ Ссылка
Проблема в том, что приоритет оператора do...end ниже, чем {}. При использовании do..end блок "привязывается" к более левому оператору, то есть мы получаем
scope(:tests_by_category, lambda) do |category_name|
...
end
Решение простое - скобки в нужном месте
scope :tests_by_category, (lambda do |category_name|
...
end)
