2012-06-12 5 views
0

У меня есть именованная область, настроенная в моем приложении rails, которая используется для поиска записи либо ее идентификатором (непосредственно из индексного представления), либо UUID (из электронной почты - в основном только для того, чтобы пользователи могли «т ввести в любой ID и просмотреть запись)Rails find_by с OR

scope :by_uuid, lambda { |id| where('id = ? OR uuid = ?', id, id) } 

Это используется в шоу-акции, поэтому ID приходит из URL, как

services/114 

services/74c083c0-8c29-012f-1c87-005056b42f8a 

Это прекрасно работает, пока вы не получите UUID, такой как 74c083c0-8c29-012f-1c87-005056b42f8a Это, к сожалению, рельсы преобразуются в значение int a nd мы получаем услуги/74 AS WELL AS запись с правильным UUID

Добавление .first к области не поможет, потому что порядок может отличаться для каждой записи, так что это не работает.

Есть ли способ предотвратить рельсы от преобразования идентификатора, подобного этому, и буквально взять строку? Очевидно, что не будет записи с идентификатором, который соответствует этому, но если он будет волей-неволей с целыми значениями переданной им строки, мы могли бы получить что-нибудь обратно.

Используя динамические искатели, такие как

Service.find_by_uuid 

или

Service.find_by_id 

работы по назначению, однако, мы должны иметь возможность получить запись с помощью UUID или идентификатор в том же методе (показать).

Есть ли способ сделать что-то вроде

Service.find_by_id_or_uuid 
+2

Ваша оригинальная идея использовать именованный объект с функцией лямбда должна работать. Вы уверены, что у вас нет ошибки в коде? Кажется, что он должен быть областью: by_uuid, lambda {где ('id =? OR uuid =?', id, uuid)} - у вас есть id как оба параметра в параметризованном запросе в вашем вопросе. –

+0

Да, потому что идентификатор исходит из строки URL-адреса, поэтому мы могли бы иметь услуги/114 или услуги/74c083c0-8c29-012f-1c87-005056b42f8a, и он должен отвечать на оба, я фактически не учитывал | id | декларация. Я отредактировал сообщение выше, чтобы уточнить. Проблема в том, что он получает значение int строки UUID и вытягивает сервисы/74 вместо правильной записи. – Oranges13

ответ

1

Мы исправили эту проблему со следующими изменениями в объем:

scope :by_uuid, lambda { |id| where('binary id = ? OR uuid = ?', id, id) } 

Это гарантирует, что строка идентификатора принимается двоичным вместо преобразования в int. Тем не менее, это будет ТОЛЬКО РАБОТА С ОСНОВНЫМИ APPS MYSQL

Смежные вопросы