1

私のアプリケーションでは、ユーザーはディスカッションを開始して参加できます。ディスカッションにタグを付けることもできます。その場合、タグの名前を含むタグが作成され (まだ存在しない場合)、どのユーザーがどのディスカッションにどのタグでタグ付けしたかを記憶するタグ付けも作成されます。

したがって、ディスカッション モデル内には次のようなものがあります。

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

1 人のユーザーからディスカッションのすべてのタグを取得する簡単な方法を作成しようとしています。理想的には、named_scopes を慎重に使用して、物事を適切かつクリーンに保つ必要があります。私はそれが次のように見えるべきだと思います:

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

Tag クラス内にこの named_scope を記述することは、非常に困難であることが判明しています。それはどのように見えるべきですか?何らかの方法でタグ付けテーブルと結合する必要がありますか?

4

3 に答える 3

1

何らかの方法でタグ付けテーブルと結合する必要があります。方法は次のとおりです。

class Tag < AR::Base
  named_scope :from_user, lambda { |user| 
    { :include => :taggings, :conditions => ["taggings.user_id = ?", user.id] } 
  }
end
于 2009-05-28T13:32:55.187 に答える
0

たぶん、これでうまくいくでしょう。ただし、named_scope ソリューションではありません。

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

ここで使用する必要があるかどうかはわかりませんtaggings.find_by_user_id(@user.id)。それが完了すると、特定のユーザーによる特定のディスカッションのタグ付けを含む配列が残ります。その配列をtaggings.tag-modelにマップします(タグ付けモデルはタグに属していると思います)。

于 2009-05-28T12:11:06.647 に答える
0

これをテストする機会はありませんでしたが、うまくいくと思います:

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

次のように使用します。

tags = @discussion.tags.by_user.named(@user)
于 2009-05-28T13:12:49.657 に答える