为什么数组不会随机,随机,限制等?

时间:2013-09-20 14:41:21

标签: ruby arrays class random limit

在我的Rails控制器代码中,我想随机检索每个内容中的三个:

@content = Content.includes(:author).find(params[:id])    
content_sub_categories = @content.subcategories

related_content = []
content_sub_categories.each do |sub_cat|
  related_content << sub_cat.contents
end

@related_content = related_content.rand.limit(3)

rand.limit(3)无效,错误包括:

undefined method `limit' for #<Array:0x007f9e19806bf0>

我熟悉Rails,但仍在学习Ruby。任何帮助都会非常感激。

也许可能是我也以这种方式呈现内容<%= @related_content %>

我正在使用:

  • Rails 3.2.14
  • Ruby 1.9.3

5 个答案:

答案 0 :(得分:7)

limit是ActiveRecord关系的一种方法(将LIMIT X添加到)生成的SQL。但是你有一个数组而不是关系,因此错误。

等效数组方法是take。您当然可以使用sample方法

将混洗和限制合并为一个步骤

答案 1 :(得分:5)

如果您想挑选3个随机元素,请使用Array#sample

related_content.sample(3)

答案 2 :(得分:1)

这应该有效:

related_content = []
content_sub_categories.each do |sub_cat|
  related_content << sub_cat.contents.sample(3) # add 3 random elements
end
@related_content = related_content

或者没有使用map的临时变量:

@related_content = @content.subcategories.map { |cat| cat.contents.sample(3) }

请注意@related_content是一个(3元素)数组的数组。

答案 3 :(得分:0)

这是怎么回事?

a = (1..10).to_a
p a.sample(3)
# >> [4, 10, 7]

答案 4 :(得分:0)

这是查找内容ID的子类别,所有这些子类别的内容并显示内容而不重复的最终答案:

def show
  @content = Content.includes(:author).find(params[:id])
  related_content = @content.subcategories.pluck(:id)
  @related_content = Content.joins(:subcategories).published.order('random()').limit(3).where(subcategories: { id: related_content}).where('"contents"."id" <> ?', @content.id)
end