条件和顺序的轨道

时间:2016-01-20 19:41:34

标签: ruby-on-rails activerecord activemodel

知道默认情况下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]

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

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

因此,如果给定用户ID,您需要按加入用户和公司的书签的created_at日期排序的公司列表。

假设用户和公司通过书签分享多对多关系,我是否正确?

如果是这种情况,则以下"加入"可以为你工作!

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

答案 2 :(得分:0)

您在created_at

order(created_at: :desc)明确排序

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

订购

答案 3 :(得分:0)

你究竟要点什么...... company_id

pluck返回一个数组,这就是为什么这不起作用的原因:

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

应该做的伎俩

答案 4 :(得分:0)

可能你可以试试这个:

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

答案 5 :(得分:0)

这就是我解决问题的方法:

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

当迭代我使用的元素时:

record.company代替record

通过这种方式,我可以使用与创建书签的订单相同的公司。