如何从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。
UPDATE:no duplicates。
def self.energy(v, w)
where('energy_id = ? AND weight = ?', v, w).limit(16).uniq.pluck(:name)
end
更新:16次,没有重复的
它返回匹配的能量和重量,不包括在except_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
+0
这会导致一堆空的结果。但它确实看起来像你在做什么。返回b,然后将b包含到c中...然后下一次调用它时,c将会包含一些东西,并且不会包含在返回中。 – Dudo 2013-02-10 07:46:18
答
如果你调用它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)
你调用方法'energy' 16次,或者你只是想16个唯一行? – texasbruce 2013-02-10 02:06:38
您使用的是什么ORM? ActiveRecord的? – 2013-02-10 03:19:31
是的。 ActiveRecord :: Base – Dudo 2013-02-10 07:36:06