0

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

我发现了这个SO question,但我有兴趣恢复活动记录关系,所以只有第二种解决方案适用,我无法让它工作。如何取回活动记录关系,以便可以在其上调用其他查询参数方法,即。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]
    }
  }

这就是说,如果该标记的标记关联的“名称”值等于我们传入的参数,则返回其 b 成员与标记相关联的所有 A 模型。在此示例中,B 为“acts_as_taggable”,而 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 回答