Некоторый контекст:
У меня есть некоторые модели, которые выглядят так:
Актер 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 или что-то подобное.Может быть, кто-то может научить меня :)