从rails中的关联中查找随机条目

时间:2010-07-12 13:13:30

标签: ruby-on-rails activerecord

控制器:

class GalleriesController < ApplicationController
  def index
    @galleries = Gallery.all
  end
end

查看:

<% for gallery in @galleries %>
  <%= image_tag(gallery.image.url(:medium)) %>
<% end %>

我有2个模特,照片属于Gallery,有许多照片。 我想在图库索引页面上的每个图库中显示图像(最好是随机而不是:第一个)。 我知道我的代码是错的,因为我没有描述从库中选择哪个图像,但我不知道如何做到这一点...我认为使用@photos = @galleries.photos.find(:first)会起作用但是我得到了一个未定义的方法'照片'在控制器中。

3 个答案:

答案 0 :(得分:3)

这适用于Rails 2 + MySQL

class Photos < ActiveRecord::Base
  # for MySQL:
  named_scope :random, lambda { |n| {:order => "RAND()", :limit => n || 1 }}
  # for SQLite and PostgreSQL
  named_scope :random, lambda { |n| {:order => "RANDOM()", :limit => n || 1 }}
end

然后你可以做类似

的事情
gallery.photos.random[0]

gallery.photos.random会随机返回1张照片,但它仍然会返回一个数组,这就是为什么需要[0]来获取此数组的第一个元素的原因。你也可以gallery.photos.random.first

如果您想要多个随机图片,可以拨打gallery.photos.random(10)以获得10张随机照片。

答案 1 :(得分:0)

@galleries是一个数组,所以你不能写@galleries.photos.find(:first),但你必须写 @galleries[0].photos.find(:first)

对于随机顺序尝试以下

<% for gallery in @galleries %>

<%= image_tag(gallery.photos.order('rand()')) %>

答案 2 :(得分:0)

你问@galleries数组的照片不起作用。您需要向Gallery的实例询问其照片。

所以在你的for循环中,以下内容适合你

<% for gallery in @galleries %>
<%= image_tag(gallery.photos.first.image.url(:medium)) %>

如果您想以随机顺序获得一张照片,那么您可以将Salils建议或者可能的方法添加到Gallery模型中,如下所示: -

def random_image()
  photos.all[rand(photos.all.size)]
end

然后在你的foreach循环中,只需<%= image_tag(gallery.random_image) %>