如何为特殊情况编写ActiveRecord查询

时间:2018-05-10 20:00:04

标签: sql ruby-on-rails activerecord

我正在使用Ruby on Rails 5.1,我有一个Entry模型,它具有word属性。可以有多个Entries具有相同的单词,因为它们的唯一性基于word加上另一个字段。在控制器中,我创建的下拉选择器@unique_entries应该只包含Entry.word的第一个实例。

我试图从多个角度做到这一点,但似乎无法做到这一点。

我尝试的最后一件事就像这个伪代码(抱歉,我在失败后删除了实际代码):

all_entries = Entry.all.order(word: :asc)
unique_entries = []
all_entries.each do |entry|
  if unique_entries.include?(entry.word)
    use the index to delete this record from all_entries
  else
    unique_entries << entry.word
  end
end

至少在我脑海中,这应该循环遍历all_entries集合,检查每个entry.word是否在unique_entries中,它以空数组开头。如果没有,则entry.word会添加到unique_entries。如果是这样,它会从ActiveRecord集合entry中删除all_entries,因为这意味着已经存在。这种方法很难,不一致地从样本数组中删除内容。

我意识到这是一个缓慢的方式,只有在我有少量记录的情况下才会好起来,所以我愿意接受其他方法的建议。我仍然是相对较新的RoR开发,并且还没有处理过非常复杂的ActiveRecord查询,所以请不要踩到我的脖子上,因为我还没有完成对你来说很“明显”的事情。感谢。

1 个答案:

答案 0 :(得分:2)

您可以让distinctpluck一起让数据库完成工作:

Entry.distinct.pluck(:word)

如果您希望数据库进行排序:

Entry.distinct.order(:word).pluck(:word)

最后一个最终应该像这样使用SQL:

select distinct word from entries order by word