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