0

モデル

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 回 (2 対 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 さん、助けてくれてありがとう!

4

3 に答える 3

2

.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 回、重複なし

これは、エネルギーと重量に一致し、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 回呼び出します

# how to call
names = []
16.times do
  if record = Model.energe(1, 1, names)
    names << record
  end
end
于 2013-02-10T01:52:56.830 に答える
1
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
于 2013-02-10T02:54:27.957 に答える
1

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)
于 2013-02-10T03:01:27.093 に答える