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

artist.songs

不过,我只想了解歌曲的类型:
artist.songs.pluck(:genre)

但是,这种类型可能会在结果中多次出现;我只想得到唯一的类型值。不幸的是,pluck在这里没有任何帮助,因为它返回一个数组,并且在它上调用uniq不会调整activerecord查询,而是调整普通的Array#uniq
我可以这样做:
artist.songs.select(:genre).uniq.pluck(:genre)

但我觉得一定有更好的办法。
附:然而,从一些最基本的基准来看,pluck + Array#uniq似乎比select + uniq + pluck快一些。

最佳答案

如果使用艺术家的songs关联,则可以select distinct打开genre,然后映射结果以仅返回字符串:

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

结果查询:
(0.2ms) SELECT distinct genre FROM "songs" WHERE "songs"."artist_id" = ? [["artist_id", 1]]
如果在缩小到艺术家范围时直接调用歌曲模型,也可以使用uniq:
Song.where(artist: artist).uniq.pluck(:genre)
结果查询:
(0.2ms) 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/

10-08 23:09