我试图通过一个属性选择对象uniq,使用@videos.uniq{|p| p.author}
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
来实现,但这是否很优雅呢?
.uniq
用于activerecord:relation
发布于 2015-01-05 19:58:01
如果需要访问查询结果,只需在ActiveRecord::Relation实例上使用#to_a
即可。
在导轨,您可以在Rails 4.0的显著更改中找到:"Model.all现在返回一个ActiveRecord::Relation,而不是一个记录数组。如果您真的想要一个数组,可以使用Relation#to_a。在某些特定情况下,这可能会导致升级时的损坏。“这对于其他关系方法是有效的,比如:where。
selected_videos = videos.to_a.uniq{|p| p.author}
发布于 2015-01-05 20:07:28
当.uniq
被应用到整个活动记录中时,它没有多大意义。
鉴于这三个属性( id
、created_at
和updated_at
)中至少有一个或多个属性对每一行都不同,应用videos.uniq{|p| p.author}
( videos
是包含所有字段的ActiveRecord::Relation
)将返回ActiveRecord::Relation
中的所有行。
当ActiveRecord::Relation
对象有一个值子集时,uniq
将能够从它们中计算出不同的值。
在你的例子中,videos.select(:author).uniq.count
会给出10个例子。
ActiveRecord::Relation#uniq
和Array#uniq
的区别在于,数组版本接受块并使用块的返回值进行比较。ActiveRecord::Relation版本的uniq简单地忽略了这个块。
发布于 2020-01-24 11:30:04
如果您需要这些记录,可以使用ActiveRecord::Relation#load
如果尚未加载记录,则将从数据库加载这些记录。如果出于某种原因,您需要在实际使用某些记录之前显式加载一些记录,则可以使用它。返回值是关系本身,而不是记录。
https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-load
https://stackoverflow.com/questions/27791553
复制