9

これは、ベスト プラクティスに関する単なる質問です。

パラメーターを 1 つ取るメソッドがあるとします。このパラメーターは、オブジェクトの ID です。理想的には、オブジェクトの ID を直接渡すか、オブジェクト自体だけを渡すことができるようにしたいと考えています。

これを行う最もエレガントな方法は何ですか?

私は次のことを思いつきました:

def method_name object
  object_id = object.to_param.to_i
  ### do whatever needs to be done with that object_id
end

そのため、パラメーターが既に id である場合、ほとんど同じままです。オブジェクトの場合は、その ID を取得します。

これは機能しますが、これはもっと良いかもしれないと感じています。また、to_param は文字列を返しますが、場合によっては「実際の」文字列 (つまり、「2」ではなく「文字列」) を返す可能性があるため、to_i を呼び出すと 0 が返されます。これは、たとえば、クラスにわかりやすい id gemを使用する場合に発生する可能性があります。

アクティブ レコードは同じ機能を提供します。次のように言っても問題ありません。

Table.where(user_id: User.first.id) # pass in id

また

Table.where(user_id: User.first) # pass in object and infer id

どうやってやっているの?この効果を達成するための最良のアプローチは何ですか?

4

2 に答える 2

10

プロセスがクロス コントローラー アクションまたはセッション中の場合は、id を使用することをお勧めします。たとえば、セッションでカートを保存しようとしている場合、より適切な選択は id です。オブジェクトの大きさを監視するのは難しいため、id を使用するとパフォーマンスが向上し、不要なエラーを回避できます。

ただし、メソッドが同じリクエスト内にあり、すべてのアクションがメモリ内にある場合は、オブジェクト自体を使用する方が高速です。たとえば、ユーザーを権限クラスに渡して、そのユーザーが何かを実行できるかどうかを確認します。すべてのオブジェクトはメモリ内の単なる参照であるため、id を抽出するための余分な手順は不要で非効率的です。

于 2013-11-05T11:37:54.680 に答える
9

私の推測では、ActiveRecord はこのようなことを行っていると思います。というか、私ならそうします。

def my_method(oid)
  oid = oid.id if oid.respond_to?(:id)

  # proceed
end
于 2013-11-05T11:29:39.610 に答える