9

这只是一个关于最佳实践的问题。

想象一下,您有一个采用一个参数的方法。这个参数是一个对象的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 回答