0

Railsアプリケーションに名前付きスコープを設定しました。これは、ID(インデックスビューから直接)またはUUID(電子メールから-基本的にユーザーがIDを入力できないようにするためのみ)またはUUIDのいずれかによってレコードを検索するために使用されます。レコードを表示)

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

これはshowアクションで使用されるため、IDは次のようにURLから取得されます。

services/114

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

これは、74c083c0-8c29-012f-1c87-005056b42f8aなどのUUIDを取得するまで、うまく機能します。残念ながら、railsはint値に変換され、正しいUUIDを持つレコードと同様にサービス/74を取得します。

スコープに.firstを追加しても、レコードごとに順序が異なる可能性があるため、役に立ちません。そのため、これは機能しません。

レールがこのようにIDを変換し、文字列を文字通り取得するのを防ぐ方法はありますか?明らかに、それに一致するIDを持つレコードはありませんが、渡された文字列の整数値で気ままに行けば、何でも取り戻すことができます。

次のような動的ファインダーの使用

Service.find_by_uuid

また

Service.find_by_id

意図したとおりに機能しますが、同じメソッドでUUIDまたはIDを使用してレコードを取得できる必要があります(show)。

次のようなことをする方法はありますか

Service.find_by_id_or_uuid
4

1 に答える 1

2

この問題は、スコープを次のように変更することで修正されました。

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

これにより、id文字列がintに変換されるのではなく、バイナリ値によって取得されるようになります。ただし、これはMYSQLベースのアプリでのみ機能します

于 2012-06-13T13:34:33.470 に答える