Rails 3: Wie arbeite ich mit Methoden an einem verwandten Objekt?

  • Ich aktualisiere eine Site mit Rails 3.1 und füge einige Funktionen hinzu. Diese Anwendung verfolgt Tests für eine Sammlung von Websites. Ursprünglich hatte ich die Note für jeden Test als Spalte in der Tabelle "Tests" gespeichert. Jetzt habe ich ein neues Modell mit der Bezeichnung "Reviews" erstellt, um eine Historie der Noten und Kommentare für jeden Test festzuhalten. Die Modelle sehen folgendermaßen aus:

     class Site < ActiveRecord::Base
      has_many :tests
      has_many :reviews, :through => :tests
    
    class Test < ActiveRecord::Base
      has_many :reviews
      belongs_to :site
    
    class Review < ActiveRecord::Base
      belongs_to :test
      has_one :user
     

    Bisher konnte ich im Site-Modell so etwas tun, um Berichte zu erhalten Daten zu Noten:

     def total_a_grades
      tests.count(:conditions => "reviewer_grade = 4 and review_status = 3")
    end
     

    Da die Noten nun aus dem Testmodell heraus sind, habe ich diese Methode für den Zugriff auf die Klassen erstellt neueste Note für jeden Test:

     def last_grade
      return reviews.find(:last).grade
    end
     

    Dies funktioniert gut, wenn die aktuellste Note in der Testansicht angezeigt wird. aber wie kann ich es auf standortebene einsetzen? Da sich der Wert jetzt in einer Methode befindet, die nicht in der Datenbank gespeichert ist, weiß ich nicht, wie er damit arbeiten soll, und kann auf den großen Online-Lernprogrammen / Screencast-Sites nichts dazu finden.

    Vielen Dank im Voraus für Ihre Hilfe!

    23 November 2011
    dburges
1 answer
  • Die Joins -Methode ermöglicht den Zugriff auf die Attribute der has_many: through . Oder fangen Sie mit der gewünschten Verknüpfung an, und die erforderlichen Verknüpfungen sind für Sie enthalten.

       tests.joins(:reviews).where("reviews.grade = 5").count
    
      reviews.where("grade = 5").count
     

    sources:

    06 December 2011
    slothbear