gpt4 book ai didi

ruby-on-rails - 从 ActiveRecord has_many 关联中提取唯一值

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:37 25 4
gpt4 key购买 nike

我有以下关联:Artist has_many Songs。因此,我可以通过以下方式获取艺术家的歌曲:

artist.songs

但是,我只想获取歌曲的流派:

artist.songs.pluck(:genre)

但是,这种类型可能会在结果中出现多次;我只想获得独特的流派值(value)。不幸的是,pluck 在这里没有任何帮助,因为它返回一个数组,并且在其上调用 uniq 不会调整 ActiveRecord 查询,但是普通的 数组#uniq.

我可以这样做:

artist.songs.select(:genre).uniq.pluck(:genre)

但我觉得一定有更好的办法。

P.S.:然而,从一些最小的基准测试来看,pluck + Array#uniq 似乎比 select + uniq + pluck 快一点。

最佳答案

如果使用艺术家的歌曲关联,您可以在genreselect distinct,然后映射结果以仅返回字符串:

artist.songs.select('distinct genre').map(&:genre)
# or...
artist.songs.select(:genre).uniq.map(&:genre) # uniq or distinct work

结果查询:

(0.2 毫秒)从“歌曲”中选择不同的流派,其中“歌曲”。“艺术家 ID”=? [["artist_id", 1]]

如果在缩小到艺术家的范围内直接调用 Song 模型,您也可以使用 uniq:

Song.where(artist: artist).uniq.pluck(:genre)

结果查询:

(0.2 毫秒)SELECT DISTINCT "songs"."genre"FROM "songs"WHERE "songs"."artist_id"= 1

两者同样高效,并且在 SQL 中执行唯一性操作而不是在 Ruby 中。

关于ruby-on-rails - 从 ActiveRecord has_many 关联中提取唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35112172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com