0

假设我有一个模型 Taggable has_many 标签,我如何通过关联标签的 taggable_id 字段找到所有可标记对象?

Taggable.find(:all, :joins => :tags, :conditions => {:tags => {:taggable_id => [1,2,3]}})

结果是:

SELECT `taggables`.* FROM `taggables` INNER JOIN `tags` ON tags.taggable_id = taggables.id WHERE (`tag`.`taggable_id` IN (1,2,3))

语法令人难以置信,但不符合我的需要,因为生成的 sql 返回具有任何、部分或全部标签的任何可标记。

如何找到带有字段 taggable_id 值 1、2 和 3 的相关标签的 taggable?

感谢您的任何建议。:)

更新:

我找到了一个解决方案,如果他们最终出现在这里,我会为其他人发布。也不过为了引起其他人的注意,他们的改进建议我很乐意接受。:)

Taggable.find(:all, :joins => :tags, :select => "taggables.*, tags.count tag_count", :conditions => {:tags => {:taggable_id => array_of_tag_ids}}, :group => "taggables.id having tag_count = #{array_of_tag_ids.count}"))
4

1 回答 1

0

你的问题有点令人困惑('标签'似乎被使用了很多:)),但我认为你想要我在这里需要的同样的东西:

Taggable.find([1,2,3], :include => :tags).tags.map { |t| t.taggables }

或(如果您希望结果是唯一的,您可能会这样做):

Taggable.find([1,2,3], :include => :tags).tags.map { |t| t.taggables }.flatten.uniq

这将获得与具有 id 1、2 和 3 的可标记对象具有相同标签的所有可标记对象。这是您想要的吗?

于 2010-04-02T17:00:41.060 回答