[英]How do I return a unique random row from a table in Ruby?
模型
class Answer < ActiveRecord::Base
def self.energy(v, w)
a = self.where('energy_id = ? AND weight = ?', v, w)
a.offset(rand(a.count)).first.name
end
视图
<%= form_for(@answer) do |f| %>
<%= f.submit "#{Answer.energy(3, 1)}", name: "answer", class: "btn" %>
<%= f.submit "#{Answer.energy(4, 1)}", name: "answer", class: "btn" %>
<% end %>
我有,并且它正确返回一个随机值。 我虽然打电话36次(18对2),但我不希望同一个值返回一次以上。 我尝试了各种.pop
变体,但每次都失败。
谢谢您的帮助!
对于呼叫,我使用了这些表单按钮,因此我选择了:
<% names = [] %>
<div id='one' class='center'>
<%= form_for(@answer) do |f| %>
<%= f.submit "#{record = Answer.energy(3, 1, names)}", name: "answer", class: "btn btn-large btn-primary" %>
<% names << record %>
<%= f.submit "#{record = Answer.energy(4, 1, names)}", name: "answer", class: "btn btn-large btn-primary" %>
<% names << record %>
<% end %>
</div>
~~ 17 more times ~~
奇迹般有效! 谢谢jvnill的帮助!
您可以将.order("RAND()")
用于mysql,将.order("RANDOM()")
用于postgre。
更新:无重复。
def self.energy(v, w)
where('energy_id = ? AND weight = ?', v, w).limit(16).uniq.pluck(:name)
end
更新:16次,没有重复
这将返回第一个与能量和体重匹配的随机记录,并且不包含在exception_names中
# model
def self.energy(v, w, except_names = [])
klass = where('energy_id = ? AND weight = ?', v, w)
klass = klass.where('name NOT IN (?)', except_names) if except_names.any?
klass.order('RAND()').first.name
end
这将调用该方法16次,每次在名称中添加一个uniq名称
# how to call
names = []
16.times do
if record = Model.energe(1, 1, names)
names << record
end
end
def self.energy(v, w)
c = []
a = self.where('energy_id = ? AND weight = ?', v, w)
b = a.offset(rand(a.count)).first.name
unless c.include?(b) do
puts b
c << b
end
end
如果您调用它16次,可以将已经可用的行作为参数传递吗? 如果可以的话,将可以工作吗?
def self.energy(v, w, records = [])
a = self.where("energy_id = ? AND weight = ? AND id NOT IN ('-1',?)", v, w, Array(records).map(&:to_param))
a.offset(rand(a.count)).first.name
end
用法:
records = []
16.times do
records << Answer.energy(10, 5, records)
end
您还可以传递单个记录而不是数组:
other_record = Answer.energy(10,5)
Answer.energy(10, 5, other_record)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.