ActiveRecord和从关系,find_by_sql或named_scope获取未使用的记录?

时间:2011-01-27 05:28:44

标签: ruby-on-rails activerecord polymorphic-associations named-scope find-by-sql

某些背景信息:

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

演员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或者其他类似的东西。也许有人可以教我:)

1 个答案:

答案 0 :(得分:0)

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