ActiveRecord:在.where查询中保留重复的对象

时间:2018-01-28 17:15:37

标签: ruby-on-rails activerecord

我有一系列ID:

ids = [1, 2, 3, 1]

如果我跑:

Product.where(id: ids)

我只会遇到Product iD 1的一次出现。 但是,我想获得与数组中一样多的对象出现。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以加载唯一记录,然后将结果转换为一个数组,其中包含对每本书的多个引用:

ids = [2109, 2511, 2108, 2109]
tmp_books = Book.find(ids)
new_books = ids.map {|x| tmp_books.detect {|b| b.id == x } }

这会生成一个数组,其中包含您只需要执行单个查询的重复项:

Book Load (0.7ms)  SELECT "books".* FROM "books" WHERE "books"."id" IN (2109, 2511, 2108)
=> ["Rick Newman", "Hassan Abbas", "Ms. Martha Byrd", "Rick Newman"]

这样做的一个结果是对该数组中的一条记录的更改可能会影响其他记录。因此,在上面的示例中,有两个对Rick Newman书籍的引用,因此更改第一条记录上的author将更改最后一条记录上的author

答案 1 :(得分:0)

你可以尝试这样,因为where子句返回记录数组:

ids = [1, 2, 3, 1]

products = []

ids.each do |id|
  products << Product.find(id)
end