将参数传递回Model以优化Random操作

时间:2010-10-15 14:10:13

标签: ruby-on-rails activerecord model random

我正在创建一个应用程序,它会根据单词中定义的字母显示随机图片。

图像使用Paperclip附加到图片模型(包含另一个“字母”字段),并将在每个块中迭代。

如何将信件从每个块传回模型进行随机选择。

这是我到目前为止所提出的,但它会引发以下错误。

 undefined method `%' for {:letter=>"e"}:Hash

型号:

def self.random(letter)
  if (c = count) != 0
    find(:first, :conditions => [:letter => letter], :offset =>rand(c))
  end
end

查看:

<% @letters.each do |a| %>
    <%= Picture.random(a).image(:thumb) %>
<% end %>

由于

1 个答案:

答案 0 :(得分:1)

一个问题是您的条件有语法错误。哈希表示法是错误的:

:conditions => [:letter => letter]

应该是

:conditions => {:letter => letter}

另外,在我看来,如果你不允许0的偏移量,你的随机范围将始终排除第一张图片。除此之外,如果随机数为0,你真的想要返回nil吗?

Picture.random(a).image(:thumb)每次c == 0时都会抛出“未定义的方法'图像'为nil:NilClass”异常。可以只使用:

def self.random(letter)
  find(:first, :conditions => {:letter => letter}, :offset =>rand(count))
end

编辑:您需要保证您的数据库包含所有字母的图像,或者告诉用户没有给定字母的图像。

<% @letters.each do |a| %>
  <% if pic = Picture.random(a).image(:thumb) %>
    <%= pic.image(:thumb) %>
  <% else %>
    No image available for <%= a %>
  <% end %>
<% end %>

或类似......

编辑:实际上我认为你的偏移策略不会起作用。另一种方法是返回给定字母可用的图像集,并从该集合中随机选择,如:

def self.random(letter)
  pics = find(:all, :conditions => {:letter => letter})
  pics[rand(pics.size)] if !pics.blank?
end