2009-05-28 10 views
1

私のアプリケーションでは、ユーザーはディスカッションを開始してディスカッションに参加できます。タグディスカッションも可能です。タグが存在する場合は、そのタグの名前(存在していない場合)を含むタグが作成され、どのユーザーがどのタグでどのタグをタグ付けしたのかを覚えておくタグ付けも作成されます。難しいnamed_scopeの状況

だから、議論モデルの内側に、私たちは、この持っている:

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

を私は1人のユーザーからの議論にすべてのタグを取得するための簡単な方法を作成しようとしています。理想的には、named_scopesは物事をきれいに保つために賢明に使われます。タグのクラス内でこのnamed_scopeを書く

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

は非常に困難であることが判明回している:私はそれがこのようになるはずだと思います。どのように見えますか?どうにか私はそれをTaggingsテーブルに参加させる必要がありますか?

答えて

1

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 

はこのようにそれを使用しますどういうわけか。方法は次のとおりです。

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

これはおそらくそれを行います。ではないがnamed_scopeソリューション:

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

あなたがここにtaggings.find_by_user_id(@user.id)を使用する必要がある場合はわかりません。それが完了すると、指定されたユーザによる議論のタグ付けを含む配列が残されます。その配列をtaggings.tag-modelにマッピングします(あなたのタグ付けモデルはタグに属していると思います)。

0

私はこれをテストする機会を持っていなかったが、私はそれがうまくいくかもしれないと思う:あなたはタギングテーブルとそれに参加する必要があります

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