найти случайную запись от ассоциации в рельсах - PullRequest
3 голосов
/ 12 июля 2010

Контроллер:

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

Вид:

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

У меня есть 2 модели, Фото принадлежит галерее, в которой много фотографий.Я хочу отобразить изображение (желательно случайное, а не первое) из каждой галереи на странице указателя галереи.Я знаю, что у меня неправильный код, так как я не описал, какое изображение выбрать из галереи, но я не уверен, как это сделать ... Я думал, что использование @photos = @galleries.photos.find(:first) будет работать, но я получаю неопределенный метод'photos' в контроллере.

Ответы [ 3 ]

3 голосов
/ 12 июля 2010

Это работает в 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 случайных фотографий.

0 голосов
/ 12 июля 2010

Вы запрашиваете у массива @galleries фотографии, которые не будут работать.Вам нужно попросить экземпляр галереи для его фотографий.

Так что в вашем цикле for тогда должно работать следующее

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

Если вы хотите получить одну фотографию в случайном порядке,Вы можете добавить предложение Салилса или добавить метод к модели Галереи следующим образом: -

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

И затем в цикле foreach просто выполните <%= image_tag(gallery.random_image) %>

0 голосов
/ 12 июля 2010

@ galleries - это массив, поэтому вы не можете написать @galleries.photos.find(:first), но вы должны написать @galleries[0].photos.find(:first)

для случайного порядка попробуйте

<% for gallery in @galleries %>

<%= image_tag(gallery.photos.order('rand()')) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...