一些上下文:
我有一些看起来像这样的模型
演员 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 或类似的事情。也许有人可以教我:)