我正在使用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查询,所以请不要踩到我的脖子上,因为我还没有完成对你来说很“明显”的事情。感谢。
答案 0 :(得分:2)
您可以让distinct
和pluck
一起让数据库完成工作:
Entry.distinct.pluck(:word)
如果您希望数据库进行排序:
Entry.distinct.order(:word).pluck(:word)
最后一个最终应该像这样使用SQL:
select distinct word from entries order by word