sql - 如何为特殊情况编写 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 查询,所以请不要因为我还没有完成对你来说“显而易见”的事情而踩到我的脖子。谢谢。
解决方案
distinct
您可以通过使用和pluck
一起让数据库完成工作:
Entry.distinct.pluck(:word)
如果您希望数据库进行排序:
Entry.distinct.order(:word).pluck(:word)
最后一个应该最终使用 SQL,如下所示:
select distinct word from entries order by word
推荐阅读
- amazon-s3 - s3 同步目录,包括目录本身
- python - 是否可以在 docker 下运行 spark udf 函数(主要是 python)?
- powershell - Active Directory“-approx”过滤器运算符如何工作?
- unity3d - 动画不适用于实例化的预制件(武器)
- r - 有条件地选择重复项并有选择地选择要保留的重复项
- html - 如何动态调整导航选项卡的宽度以填满屏幕
- php - 深度多维数组上的array_filter
- tensorflow - Tensorflow keras,洗牌不洗牌sample_weight?
- amazon-s3 - 在 Jupyter Notebook 中找不到 PySpark 的 org.apache.hadoop.fs.s3native.NativeS3FileSystem
- listview - 控制 Listview 中元素的宽度 - 颤动