2009-05-28 22 views
1

In meiner Anwendung können Benutzer starten und an Diskussionen teilnehmen. Sie können Diskussionen auch taggen; Wenn dies der Fall ist, wird ein Tag erstellt, der den Namen des Tags enthält (falls es ihn noch nicht gab) und ein Tagging, das sich erinnert, welcher Benutzer welche Diskussion mit welchem ​​Tag getaggt hat, wird ebenfalls erstellt.Eine schwierige Situation namens named_scope

So in der Diskussion Modell haben wir diese:

has_many :taggings 
has_many :tags, :through => :taggings 

Ich versuche, eine einfache Möglichkeit zu schaffen, alle Tags auf einer Diskussion von einem Benutzer abgerufen werden. Im Idealfall würden named_scopes vernünftig verwendet, um die Dinge schön und sauber zu halten. Ich denke, dass es so etwas wie folgt aussehen sollte:

tags = @discussion.tags.from_user(@user) 

Schreiben dieses named_scope in der Tag-Klasse erweist sich sehr schwierig. Wie sollte es aussehen? Muss ich es irgendwie mit dem Taggings-Tisch verbinden?

Antwort

1

brauchen Sie es mit den Markierungen Tabelle beitreten irgendwie. Hier ist wie:

class Tag < AR::Base 
    named_scope :from_user, lambda { |user| 
    { :include => :taggings, :conditions => ["taggings.user_id = ?", user.id] } 
    } 
end 
0

Vielleicht wird dies tun. Nicht named_scope Lösung aber:

tags = @discussion.taggings.find_by_user(@user).map(&:tag) 

nicht sicher, ob Sie brauchen taggings.find_by_user_id(@user.id) hier zu verwenden. Wenn das erledigt ist, bleibt ein Array übrig, das die Markierungen bei gegebener Diskussion durch den gegebenen Benutzer enthält. Ordnen Sie dieses Array getaggings.tag-model zu (ich nehme an, Ihr Tagging-Modell gehört zu einem Tag).

0

Ich habe nicht Chance dies zu testen habe, aber ich denke, dass es funktionieren könnte:

class Discussion < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, :through => :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :discussion 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :discussions, :through => :taggings 

    named_scope :by_user do 
    def named(user) do 
     Tagging.find_by_user_and_discussion(user, discussion).tags 
    end 
    end 
end 

es wie folgt verwendet:

tags = @discussion.tags.by_user.named(@user)