0

いくつかのコンテキスト:

こんな感じのモデルもいます

アクター has_many Acts

行為はアクターに属し、決定に属します

決定 has_many Acts, belongs_to Prompt

プロンプト has_many 決定

私がする必要があるのは、ActorsController で、利用可能なすべてのプロンプトのうちまだ使用されていないランダムなプロンプトを取得することです。

私の Rails アプリでは、アクターにいくつかの選択肢を与えるプロンプトが表示されます。彼らが選択 (決定) を行うと、それはデータベースに Act として保存されます。

私はnamed_scopeとfind_by_sqlのさまざまな反復を試みましたが、どれもうまくいきませんでした。また、非常に多くのモデルが動作していて、私が知らないように見えるため、最初から私の考えが正しかったかどうかさえわかりません.どこから始めれば。

これが私が何に反対しているかのアイデアを与えることを願っています。攻撃の計画を立てるための一般的な指針さえいただければ幸いです。

ありがとう!

編集

これを数時間噛んだ後、何かが機能しましたが、非常に面倒で、ログがSQL呼び出しでいっぱいになっているため、批判的な目で見られることは間違いありません.

プロンプト モデルでは:

  named_scope :available, lambda { |used| 
    { :conditions => ["id NOT IN (?)", used ] }
  }

アクター モデルでは:

  def used_prompts
    prompts = Array.new
    if self.acts && self.acts.length >= 1
      self.acts self.acts.each { |act| prompts.insert(0, act.decision.prompt.id) }
      return prompts.sort
    else
      return [0]
    end
  end

そして ActorsController で:

@prompt = Prompt.available(@actor.used_prompts).find(:first, :order => "RAND()")

明らかに、used_prompts の if ブロックはここで 1 つの有罪の当事者ですが、self.acts.decisions.each などを実行できないため、これに対処するより良い方法はわかりません。たぶん誰かが私を教えてくれます:)

4

1 に答える 1

0

最も簡単な方法は、Decisionモデルにafter_createまたは同様のコールバックを追加して、関連付けられたプロンプトを使用済みとしてマークすることです。いくつかの結合を使用してこれを実現することもできますが、これにはもう少し作業が必要であり、スケーラビリティの問題が発生する可能性があります(気になる場合)。

于 2011-01-27T06:26:22.963 に答える