0

モデル B と 1 対 1 で関連付けられているモデル A があるとします。モデル B は「acts_as_taggable」に設定されています。特定の文字列を持つ B 属性が tagged_with であるすべての A インスタンスを選択するアクティブなレコード関係を返したいと思います。A.where('b.tagged_with = ?', 'some_tag')

私はこのSOの質問を見つけましたが、アクティブなレコード関係を取り戻すことに興味があるので、2番目の解決策しか適用できず、機能させることができません。アクティブなレコード関係を取り戻すにはどうすればよいので、他のクエリ パラメータ メソッドを呼び出すことができます。A.b_tagged_with('tag').where(...) b_tagged_with は名前付きスコープです

4

1 に答える 1

0

私自身の質問に答えるために、A のスコープ定義は次のようになります。

    scope :tagged_with, lambda { |tag|
    {
        :joins => "INNER JOIN taggings ON taggings.taggable_id = as.b_id\
                   INNER JOIN tags ON tags.id = taggings.tag_id AND taggings.taggable_type = 'B'",
        :conditions => ["tags.name = ?", tag]
    }
  }

これが何を言っているのかというと、タグ付けのタグの関連付けが、渡したパラメーターと等しい「name」値を持っている場合、b メンバーがタグ付けに関連付けられているすべての A モデルを返すということです。これにより、次のことが可能になります。

a = A.new
b = B.new
b.tag_list = ['tag1', 'tag2', 'tag3']    
a.b = b
new_a = A.tagged_with('tag1').ordered(...
#At this point new_a.last == a
于 2011-12-22T01:14:14.277 に答える