【问题标题】:rails mongoid criteria find by associationrails mongoid 标准通过关联查找
【发布时间】:2012-04-03 10:13:29
【问题描述】:

我正在尝试通过包含在 belongs_to 关系中的关联用户名查找记录,但它不起作用。

文章属于用户 用户有很多文章

Article.where(user_id: someid) 工作正常,但我想使用存储在用户表中的用户名作为参考。

Article.includes(:user).where(:username => "erebus")
Article.includes(:user).where("user.username" => "erebus")

我也有identity_map_enabled: true

Article.includes(:user).inclusions 返回关系详情

不起作用,我不明白什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb associations mongoid


    【解决方案1】:

    您必须记住,mongodb 中没有连接。在关系数据库中,includes 形成一个连接查询,您可以在查询中使用两个表中的列。但是由于 mongodb 中没有连接,所以不可能。

    在 mongoid 中,includes 只是保存了一堆 db 调用。它在identity map中获取并存储关联记录以便快速检索,但是在查询时,一个查询只能处理一个集合。

    如果您需要基于用户名的文章,我建议您采取以下解决方法:

    user_ids = User.where(username: 'erebus').only(:_id).map(&:_id)
    articles = Article.where(:user_id.in => user_ids)
    

    【讨论】:

    • 如果我们从另一种方式获取数据并且当前集合中实际上没有数组,但是另一个呢?
    • 哦,是的,我知道答案:你不能。
    • 这不会增加查询的复杂性吗?如果我们有什么相同的结果,比如加入或一些替代解决方案
    • @JaiKumarRajput 这是一个非常过时的解决方案,mongodb现在支持join like功能,请查阅文档。
    • Rubish,你能给我一些链接或公共资源,我可以帮助吗?
    【解决方案2】:

    你可以把它比 rubish 建议的短一点:

    user_ids = User.where(username: 'erebus').pluck(:id)
    articles = Article.where(:user_id.in => user_ids)
    

    或者一个班轮:

    articles = Article.where(:user_id.in => User.where(username: 'erebus').pluck(:id))
    

    【讨论】:

    • 这不会增加查询的复杂性吗?如果我们有什么相同的结果,比如加入或一些替代解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多