Rails:act-as-taggable-on:在关系上使用tagged_with

时间:2011-12-21 03:38:51

标签: ruby-on-rails acts-as-taggable-on active-record-query

假设我有一个模型A与模型B有一对一的关联。模型B设置为'acts_as_taggable'。我想返回一个活动记录关系,它选择所有A实例的B属性被标记为具有某个字符串。它看起来像: A.where('b.tagged_with =?','some_tag')

我发现了this问题,但我有兴趣获得积极的记录关系,所以只有第二个解决方案适用,我无法让它工作。如何恢复活动记录关系,以便我可以调用其他查询参数方法,即。 A.b_tagged_with('tag')。where(...)其中b_tagged_with是命名范围

1 个答案:

答案 0 :(得分: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]
    }
  }

这就是返回所有A模型,其b成员与标记相关联,如果标记'标记关联的'name'值等于我们传入的参数。在此示例中,B'arace_as_taggable',A doesn'吨。 这允许我这样做:

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