传递对象或id

时间:2013-11-05 11:26:22

标签: ruby-on-rails ruby

这只是关于最佳做法的问题。

想象一下,你有一个带一个参数的方法。此参数是对象的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,它几乎保持不变;如果它是一个对象,它就会得到它的身份。

这有效,但我觉得这可能会更好。此外,to_param返回一个字符串,在某些情况下可以返回一个“真实”字符串(即“字符串”而不是“2”),因此在调用to_i时返回0。例如,当使用friendly id gem类时,可能会发生这种情况。

活动记录提供相同的功能。如果你说:

并不重要
Table.where(user_id: User.first.id) # pass in id

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

他们是怎么做到的?达到这种效果的最佳方法是什么?

2 个答案:

答案 0 :(得分:9)

我的猜测是ActiveRecord会做这样的事情。或者说,我就是这样做的。

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

  # proceed
end

答案 1 :(得分:9)

如果进程是跨控制器操作或在会话中,最好使用id。例如,您要在会话中保存购物车,更好的选择是id。很难看出对象的大小,使用id有助于提高性能并避免不必要的错误。

但是,如果方法在同一个请求中并且所有操作都在内存中,则使用对象本身会更快。例如,您将用户传递给权限类以检查他是否可以执行某些操作。因为所有对象只是内存中的引用,所以提取id的额外步骤是不必要且效率低的。