ActiveRecord и получение неиспользуемых записей из отношений, find_by_sql или named_scope? - PullRequest
0 голосов
/ 27 января 2011

Некоторый контекст:

У меня есть некоторые модели, которые выглядят так:

Актер has_many Акты

Акт принадлежит_ Актеру, принадлежит_ Решению

Решение has_many Акты, принадлежит_просмотру

Подсказка has_many Решения

Мне нужно в ActorsController получить случайную подсказку, которая еще не использовалась из всех доступных подсказок.

В моем приложении rails актерам представлены подсказки, которые дают им несколько вариантов выбора.Когда они делают выбор (Решение), это сохраняется в БД как Акт.

Я пробовал разные итерации named_scope и find_by_sql, но ни одна из них не сработала, и я даже не уверен, правильно ли я начал с них думать, поскольку в работе так много моделей, и яКажется, я не знаю, с чего начать.

Надеюсь, это дает представление о том, с чем я столкнулся.Я был бы признателен даже за общий указатель для формирования плана атаки.

Спасибо!

edit

После пережевывания этого для парычасы, у меня что-то работает, но это очень грязно, и мои журналы заполнены вызовами SQL, так что это определенно может выдержать критический взгляд.

В модели Prompt:

  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()")

Очевидно, что блок if в used_prompts - одна из виновных, но я не знаю лучшего способаиметь дело с этим, так как я не могу сделать self.acts.decisions.each или что-то подобное.Может быть, кто-то может научить меня :)

1 Ответ

0 голосов
/ 27 января 2011

Самое простое, что можно сделать, это добавить after_create или аналогичный обратный вызов в модели Decision, который помечает соответствующее приглашение как использованное.Вы также можете достичь этого, используя некоторые объединения, но это потребует немного больше работы и, возможно, приведет к проблемам с масштабируемостью (если вам это нужно).

...