首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails:将activerecord关系转换为数组的正确方式?

Rails:将activerecord关系转换为数组的正确方式?
EN

Stack Overflow用户
提问于 2015-01-06 03:14:50
回答 3查看 67.4K关注 0票数 51

我试图通过一个属性选择对象uniq,使用@videos.uniq{|p| p.author}

代码语言:javascript
运行
复制
  time = Time.new(2014, 12)
  start_time = time.beginning_of_month
  end_time = time.end_of_month

  videos = Video.where("created_at > ? AND created_at < ?", start_time, end_time).where("likes > ?", 15)
  selected_videos = videos.uniq{|p| p.author}
  puts videos.count, videos.class, selected_videos.count 
 #=> 23, Video::ActiveRecord_Relation, 23

  videos_first = videos.first(23)
  selected_videos = videos_first.uniq{|p| p.author}
  puts videos_first.count, videos_first.class, selected_videos.count
  #=> 23, array, 10

.uniq不适合ActiveRecord_Relation。问题是查询返回一个Video::ActiveRecord_Relation,但我需要array

当然,这可以通过使用to_a来实现,但这是否很优雅呢?

  1. 正确的处理方法是什么?
  2. 是否可以将.uniq用于activerecord:relation
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-06 03:58:01

如果需要访问查询结果,只需在ActiveRecord::Relation实例上使用#to_a即可。

导轨,您可以在Rails 4.0的显著更改中找到:"Model.all现在返回一个ActiveRecord::Relation,而不是一个记录数组。如果您真的想要一个数组,可以使用Relation#to_a。在某些特定情况下,这可能会导致升级时的损坏。“这对于其他关系方法是有效的,比如:where。

代码语言:javascript
运行
复制
selected_videos = videos.to_a.uniq{|p| p.author}
票数 56
EN

Stack Overflow用户

发布于 2015-01-06 04:07:28

.uniq被应用到整个活动记录中时,它没有多大意义。

鉴于这三个属性( idcreated_atupdated_at )中至少有一个或多个属性对每一行都不同,应用videos.uniq{|p| p.author} ( videos是包含所有字段的ActiveRecord::Relation )将返回ActiveRecord::Relation中的所有行。

ActiveRecord::Relation对象有一个值子集时,uniq将能够从它们中计算出不同的值。

在你的例子中,videos.select(:author).uniq.count会给出10个例子。

ActiveRecord::Relation#uniqArray#uniq的区别在于,数组版本接受块并使用块的返回值进行比较。ActiveRecord::Relation版本的uniq简单地忽略了这个块。

票数 4
EN

Stack Overflow用户

发布于 2020-01-24 19:30:04

如果您需要这些记录,可以使用ActiveRecord::Relation#load

如果尚未加载记录,则将从数据库加载这些记录。如果出于某种原因,您需要在实际使用某些记录之前显式加载一些记录,则可以使用它。返回值是关系本身,而不是记录。

https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-load

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27791553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档