【问题标题】:ActiveRecord and getting unused records from a relationship, find_by_sql or named_scope?ActiveRecord 并从关系 find_by_sql 或 named_scope 中获取未使用的记录?
【发布时间】:2011-01-27 05:28:44
【问题描述】:

一些上下文:

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

Actor has_many Acts

Act belongs_to Actor,belongs_to Decision

Decision has_many Acts, 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 或类似的事情。也许有人可以教我:)

【问题讨论】:

  • 使用 RAND() 真的会减慢您的查询速度,仅供参考。

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


【解决方案1】:

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

【讨论】:

  • 感谢普雷斯顿的回复。不幸的是,提示将被每个单独的 Actor 重用,因此在它们上设置标志会导致其他问题。不过,您可能对可扩展性有所了解,但我担心我可能已经越过了这一点:)
  • 让我试着理解。您的目标是仅向该演员提供未选择(由该演员)的提示?
  • 正确。 Prompt 会被回收以供其他 Actors 使用,但任何单个 Actor 只能被给予一次任何 Prompt。提示是在基于文本的游戏中呈现的,因此重复提示会使游戏玩法有些蹩脚。谁愿意在 15 个实例中被问 3-5 次相同的问题,对吧?我们测试应用程序的孩子们说得很清楚,祝福他们缺乏微妙之处:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多