知道默认情况下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]
我的假装结果在两种情况下都是相同的(相同的顺序)。 公司应按照创建该公司的书签的顺序返回。
答案 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')
答案 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
。
通过这种方式,我可以使用与创建书签的订单相同的公司。