Rails where条件和顺序

Rails where condition and order

知道默认情况下 Rails 按 ID 排序数据,如何按给定 where 子句的 ID 排序?

ids = Bookmark.where(user_id: 7).order(created_at: :desc).pluck(:company_id)

结果:

[146, 140, 128, 4, 2]

现在,当我尝试从 ids

中获取相同顺序的公司时
Company.where(id: ids).pluck(:id)

结果:

[2, 4, 128, 140, 146]

预期结果

[146, 140, 128, 4, 2]

我假装的结果在这两种情况下都是一样的(顺序相同)。 这些公司的返回顺序应与创建该公司书签的顺序相同。

您在 order(created_at: :desc)

中按 created_at 明确订购

您想在 company_id ids = Bookmark.where(user_id: 7).order(:company_id).pluck(:company_id)

之前订购

您究竟想通过...订购什么 company_id

pluck returns 一个数组,这就是为什么这不起作用:

ids = Bookmark.where(user_id: 7).pluck(:company_id).order(company_id: :desc)
## undefined method `order' for Array

相反,您可以在数组上调用 sort

ids = Bookmark.where(user_id: 7).pluck(:company_id).sort

这应该可以解决问题

Company.includes(:bookmarks) .where(id: ids).order('bookmarks.created_at desc').pluck(:id)

也许你可以试试这个:

company_by_id = Company.find(ids).index_by(&:id) # Gives you a hash indexed by ID
ids.collect {|id| company_by_id[id].id }

我是这样解决问题的:

Bookmark.includes(:company).where(user_id: current_user).order(created_at: :desc)

并且在遍历我使用的元素时:

record.company 而不是 record.

这样我就有了与创建书签相同顺序的公司。

所以看起来给定了一个用户 ID,您想要一个公司列表,该列表按加入用户和公司的书签的 created_at 日期排序。

我假设用户和公司通过书签共享 many-to-many 关系是否正确?

如果是这种情况,以下 "join" 可能对您有用!

Company.joins(:bookmarks).where('bookmarks.user_id = ?', 7).order('bookmarks.created_at')

当然,在您的代码中,这可以泛化为任何用户抓取公司!

user_id = 42
companies = Company.joins(:bookmarks).where('bookmarks.user_id = ?', user_id).order('bookmarks.created_at')

ActiveRecord "joins" reference