在我的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 %>
?
我正在使用:
答案 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