Некоторый контекст:
У меня есть несколько моделей, которые выглядят так
Актёр has_many Действия
Действие принадлежит актеру, принадлежит решение
Решение имеет_много действий, принадлежит подсказке
Подсказка has_many решений
Что мне нужно сделать, так это в ActorsController получить случайную подсказку, которая еще не использовалась из всех доступных подсказок.
В моем приложении rails Актеры получают подсказки, которые дают им несколько вариантов выбора. Когда они делают выбор (решение), это сохраняется в базе данных как действие.
Я пробовал различные итерации 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()")
Очевидно, что блок if в used_prompts является одной из виновных сторон, но я не знаю лучшего способа справиться с этим, так как я не могу сделать self.acts.decisions.each или что-то в этом роде. Может кто меня научит :)