2016-01-20 37 views
1

通过ID知道,在默认情况Rails的订单数据,如何通过IDS,我可以为了给where子句?Rails的where条件和秩序

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]

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

回答

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

0

您明确created_atorder(created_at: :desc)

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

+0

我相信,这将通过对'bookmarks',而不是''pluck'ed的company_id''id'排序。 – JackCollins

+0

@JackCollins谢谢,我更新了我的答案。 –

+0

@RayBaxter我已经更新了这个问题,以澄清我在公司的订单。 –

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 

这应该做的伎俩

+0

我没有对数组进行排序,我希望公司从创建日期的书签开始。 –

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

我需要按照书签表中的created_at列排序的公司,而不是公司表。 –

+0

编辑,检查出 –

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 } 
+0

您的答案至少在PostgreSQL中不起作用。 –

+0

我已经更新了PostgreSQL的答案,请在那里查看 – Yang

0

这是我已经解决了这个问题:

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

当迭代我使用的元素:

record.company而不是record

这样,我有公司来自同一订单的书签,其中创建的。

+1

我以前遇到过这个问题。我结束了从[这里]使用Gunchars答案(http://stackoverflow.com/questions/1680627/activerecord-findarray-of-ids-preserving-order)。我认为这比在你的这个答案中迭代书签记录要快。希望能帮助到你。 –

+0

@ Jay-ArPolidario我需要在视图中迭代。但谢谢指出它。 –