首页 > 解决方案 > 如何为特殊情况编写 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是否在 in 中unique_entries,它以一个空数组开始。如果没有,则将其entry.word添加到unique_entries. entry如果是这样,它会从 ActiveRecord 集合中删除all_entries,因为这意味着一个已经存在。这种方法失败了,不一致地从样本数组中删除内容。

我意识到这是一条缓慢的路,只有在我有少量记录时才会好,所以我愿意接受其他方法的建议来解决这个问题。我对 RoR 开发还比较陌生,还没有处理非常复杂的 ActiveRecord 查询,所以请不要因为我还没有完成对你来说“显而易见”的事情而踩到我的脖子。谢谢。

标签: sqlruby-on-railsactiverecord

解决方案


distinct您可以通过使用和pluck一起让数据库完成工作:

Entry.distinct.pluck(:word)

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

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

最后一个应该最终使用 SQL,如下所示:

select distinct word from entries order by word

推荐阅读