【问题标题】:Rails find by *all* associated tags.id inRails 通过 *all* 关联的 tags.id 查找
【发布时间】:2010-04-02 16:39:06
【问题描述】:

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

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}"))

【问题讨论】:

    标签: ruby-on-rails activerecord find has-many


    【解决方案1】:

    你的问题有点令人困惑(“标签”似乎被使用了很多:)),但我认为你想要我需要的同样的东西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 的可标记对象具有相同标签的所有可标记对象。这是您想要的吗?

    【讨论】:

    • 您好,感谢您的回复。抱歉解释不好,我认为这个场景会比我实际使用的场景更熟悉。恐怕我不想通过它们的 id 来查找 taggable,而是通过关联标签的 taggable_id 来查找 taggable。这种事情可以在 mysql 中使用 group by 完成,但不希望将 mysql 写入我的应用程序。
    • 抱歉,还不是很清楚。所以你的数据库中有一个连接表,它位于 Tag 和 Taggable 之间?你能不能只写SQL,我帮你翻译成Ruby。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多