У меня есть метод класса для модели под названием order_by_ids(ids), который вызывается отношением ActiveRecord. Ниже приведен пример его использования:
User.where(id: [1,2,3]).order_by_ids([2,1,3])
... вернет пользователей 1, 2 и 3 в следующем порядке: [2,1,3]
Я хотел бы, чтобы он возвращал исходное отношение (по сути, ничего не делая), если был передан пустой массив.
Следующее возвращает весь класс, а не только отношение, которое он вызывает:
return self unless ids.present?
Следующее работает на 100%, но кажется неэлегантным. Кроме того, я думаю, что он запускает ненужный запрос (в любом случае кажется медленнее в консоли):
return where.not(id: nil) unless ids.present?
Есть ли быстрый способ просто вернуть отношение, которое оно вызывает? Теоретически я мог бы сделать это областью действия, но меня научили избегать областей действия с аргументами (см. Руководство это для справки).
Примечание: я использую Rails 3, поэтому all возвращает массив. По сути, я ищу версию all для Rails 4.
@spickermann Добавлена ссылка на руководство по Ruby On Rails. Имейте в виду, что это не обязательно делает руководство правильным, просто сообщая вам, где я его взял.
Но то же самое руководство расскажет вам в следующем раздел, как решить проблему: используйте область видимости с аргументом ...
@mrmicrowaveoven all у вас работал?
@AndreyDeineko Не с моей версией рельсов. Есть ли решение?





Следующее должно сохранить цепочку областей видимости восходящего направления (возвращая all, а не self):
return all if ids.none?
P.S. Именованные области - это общепринятый и общепринятый способ работы с запросами.
Так что я предполагаю, что это вернет Relation on Rails 4 и новее. Текущая версия рельсов моей компании преобразует это в массив. Смотрите здесь: stackoverflow.com/questions/18456536/…. Есть ли более универсальный способ сделать это?
@mrmicrowaveoven, какую версию Rails использует ваша компания?
Почему вас учили избегать рамок аргументов? В чем причина этого правила?