0

一些上下文:

我有一些看起来像这样的模型

演员 has_many Acts

行为 belongs_to 演员,belongs_to 决策

决定 has_many 行为,belongs_to 提示

提示 has_many 决定

我需要做的是在 ActorsController 中,获取所有可用 Prompts 中尚未使用的随机 Prompt。

在我的 Rails 应用程序中,Actor 会收到提示,让他们做出一些选择。当他们做出选择(决定)时,它作为一个动作保存在数据库中。

我尝试了 named_scope 和 find_by_sql 的各种迭代,但都没有奏效,我什至不确定我的想法是否正确,因为有很多模型在工作,我似乎不知道从哪儿开始。

我希望这可以让我了解我的反对意见。我什至会很感激一个通用的指针来形成一个攻击计划。

谢谢!

编辑

在咀嚼了几个小时之后,我得到了一些工作,但它非常混乱,而且我的日志中充满了 SQL 调用,所以它绝对可以受到批评。

在提示模型中:

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

在 Actor 模型中:

  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 块在这里是一个有罪的一方,但我不知道更好的方法来处理这个问题,因为我不能做 self.acts.decisions.each 或类似的事情。也许有人可以教我:)

4

1 回答 1

0

最简单的做法是在决策模型上添加一个 after_create 或类似的回调,将关联的提示标记为已使用。您也可以使用一些连接来实现这一点,但这需要更多的工作,并且可能会导致可伸缩性问题(如果您关心的话)。

于 2011-01-27T06:26:22.963 回答