假设我有一个模型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。
如何找到字段taggable_id值为1,2和3的相关标签的可标记文件?
感谢您的任何建议。 :)
更新:
我找到了一个解决方案,如果他们最终会在这里发布给别人。另外,对于那些提出改进建议的人,我很乐意接受。 :)
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}"))
答案 0 :(得分:0)
您的问题有点令人困惑(“标签”似乎使用了很多:)),但我认为您需要我需要的同样的事情here:
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的可标记具有相同标记的所有可标记。这是您想要的吗?