has_many :through

Taki przypadek:
Mamy modele User i Task połączone przez model TaskRealization, który to, oprócz referencji do taska i usera, zawiera ocenę realizacji zadania oraz okres, w którym zostało ono wykonane (wyrażany, powiedzmy, integerem). Niektóre zadania mogą być cykliczne i realizowane w różnych okresach na różnym poziomie jakości.

[code=ruby]user.task_realizations << TaskRealization.new(:task = t1, :period => 1, :points => 4)
user.task_realizations << TaskRealization.new(:task = t2, :period => 1, :points => 6)
user.task_realizations << TaskRealization.new(:task = t1, :period => 2, :points => 1)
user.task_realizations << TaskRealization.new(:task = t1, :period => 3, :points => 12)

user.tasks.length #=> 4
user.tasks.uniq.length #=> 2[/code]
a) Czy da się zrobić tak, by user.tasks zachowywał się bardziej intuicyjnie (jak zbiór)?
b) Jeśli nie to jak zrobić, żeby takich problemów uniknąć?

Dodaj opcję :uniq => true do has_many

I pamiętaj o tym, że działa ona tylko przy wyświetlaniu obiektów (w bazie nadal będą duplikaty).

No to chyba sensowniej zrobić walidację:

class TaskRealization < AR::Base validates_uniqueness_of :user_id, :scope => :task_id end
i/lub dodać odpowiedni constraint w DB.

EDIT:
Nie wiem dokładnie czy chodzi Ci o to, żeby w momencie utworzenie w asocjacji nie było duplikatów, czy po odczytaniu z DB. Ale kombo powyższych rozwiązań powinno dać oczekiwany efekt.

Nie do końca wiem gdzie się nieprecyzyjnie wyraziłem :wink: Chodzi o to, żeby były możliwe dwie instancje TaskRealization referujące ten sam Task i tego samego Usera, natomiast żeby user.tasks zachowywał się jak zbiór, czyli nie wyświetlał duplikatów. Czyli, jak widzę, post hosiawaka rozwiązuje tę sprawę.