【问题标题】:Index display order索引显示顺序
【发布时间】:2015-06-23 10:14:15
【问题描述】:

我有一个搜索表单,它以随机顺序返回一个 id 数组,具体取决于搜索中哪个元素有更多关键字。在索引中,它们按最小 id 排序。

例如:

def search
    ids = [13,8,2,4,7]
    items.where("id in ?", ids)
  end

在我的控制器的索引操作中,我有类似的东西

@items = Items.search

但项目在索引表中仍以[2,4,7,8,13] 之类的顺序显示。

如何按照我在搜索功能中查询的顺序显示项目?

【问题讨论】:

  • 在不了解您的结构的情况下,我会在您的数据库表中添加另一列 items_id。我相信 :id 总是会按顺序出现,而 :items_id 可能会有所不同。
  • 是的,我还想添加该列,但您知道吗?必须有一种方法可以按我查询它们的顺序获取这些项目...但是如果我找不到方法,我将不得不创建该列
  • 该模型上是否有任何default_scope 声明?
  • 问题是它以确切的顺序查找它们,但按顺序返回项目我不知道为什么,我认为这与我不知道的查询的“in”子句有关'不知道....而且我不认为有一个 default_scope,但是我又是一个超级新手,所以我不知道

标签: ruby-on-rails ruby ruby-on-rails-4 indexing scaffold


【解决方案1】:

要根据现有索引进行排序,您需要执行以下操作:

ids = [13,8,2,4,7]
id_positions = Hash[ids.each_with_index.to_a]

items.where(id: ids).sort_by do |r|
  id_positions[r.id]
end

这将使用映射表将它们返回到原来的顺序。

请注意,这与惰性迭代不兼容,它们都需要被拉入才能进行操作。不过,它应该适用于处理结果子集的分页。

sort_by 调用可以在任何 Array 类型的集合上完成,因此即使是 Search 的结果也可以工作。

【讨论】:

  • 谢谢,我知道一定有办法!像魅力一样工作
【解决方案2】:

实现与 tadman 的答案相同的结果的方法更短一些。

ids = [13,8,2,4,7]
items = Item.find(ids) #or whatever your search criteria includes...
items.index_by(&:id).values_at(*ids) #returns in ids order from above...

【讨论】:

  • Rails 确实引入了一些方便的方法,例如 index_by,完全值得使用。
猜你喜欢
  • 2013-09-30
  • 2021-08-18
  • 1970-01-01
  • 2018-08-25
  • 2013-11-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多