加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:36:02 所属栏目:百科 来源:网络整理
导读:我有以下关联:艺术家has_many歌曲.因此,我可以通过以下方式获得艺术家的歌曲: artist.songs 但是,我想只获得歌曲的类型: artist.songs.pluck(:genre) 但是,这种类型可能会在结果中出现多次;我只想获得独特的流派价值观.不幸的是,pluck在这里没有任何帮助,
我有以下关联:艺术家has_many歌曲.因此,我可以通过以下方式获得艺术家的歌曲:

artist.songs

但是,我想只获得歌曲的类型:

artist.songs.pluck(:genre)

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

我可以这样做:

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

但我觉得必须有更好的方法.

P.S.:从一些最小的基准测试来看,采用Array#uniq似乎比选择uniq采集要快一些.

解决方法

如果使用艺术家的歌曲关联,您??可以选择不同的流派,然后映射结果以返回字符串:

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]]

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

Song.where(艺术家:艺术家).uniq.pluck(:genre)

结果查询:

(0.2ms)SELECT DISTINCT“songs”.“genre”FROM“songs”WHERE“songs”.“artist_id”= 1

两者都是同等有效的,并且在SQL中执行唯一性操作,而不是在Ruby中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读