某些背景信息:
我有一些看起来像这样的模型
演员has_many使徒行传
Act belongs_to Actor,belongs_to Decision
决定has_many Acts,belongs_to Prompt
提示has_many决定
我需要做的是在ActorsController中,获取一个尚未使用的所有可用提示的随机提示。
在我的rails应用程序中,Actors会显示提示,为他们提供一些选择。当他们做出选择(决定)时,将其作为法案保存在数据库中。
我已经尝试了各种各样的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块在这里是一个有罪的一方,但我不知道更好的方法来解决这个问题,因为我不能做self.acts.decisions.each或者其他类似的东西。也许有人可以教我:)
答案 0 :(得分:0)
最简单的方法是在Decision模型上添加after_create或类似的回调,标记所使用的关联提示。您也可以使用一些连接来实现这一点,但这需要更多的工作,并且可能会导致可伸缩性问题(如果您关心)。