Model.ids和Model.select(:id).map(&:id)之间的区别

时间:2017-05-26 09:51:23

标签: ruby-on-rails activerecord rails-activerecord

我一直试图找到rails处理 {user1: "a", user2: "b"}, {user1: "a", user2: "c"}, {user1: "b", user2: "d"}, {user1: "b", user2: "c"}, {user1: "b", user2: "e"}, {user1: "c", user2: "f"}

的方式

当我尝试在控制台中执行相同操作时,我会看到差异

Model.ids不加载活动记录模型

但是,Model.select(:id).map(&:id)会加载活动记录模型。

任何人都可以分享Rails何时加载活动记录模型以及何时不加载。

此外,加载活动记录模型是否具有任何优点/缺点,反之亦然。

1 个答案:

答案 0 :(得分:2)

Model.ids相当于

Model.pluck(:id)

当数据库为您返回数组时,这是更快的方法。

Model.select(:id)

...返回表行(模型对象)但仅包含:id属性,因此您可以使用#map方法获取:id数组。

Model.select(:id).map(&:id)

因此,这会创建一个对象的活动记录关系,然后需要由#map处理,这效率会降低。

首选Model.ids

通常,直接或间接使用的.pluck不会加载active_record模型。 .select。设计.where.order会自动包含db SELECT调用。