【问题标题】:Ruby on Rails ActiveRecord query using a join使用连接的 Ruby on Rails ActiveRecord 查询
【发布时间】:2012-05-10 14:24:24
【问题描述】:

我有一个 User 模型,并且用户有一个 has_many pets 的关系。我希望能够编写一个 ActiveRecord 查询,我可以在其中选择所有用户的宠物没有 pet.name 的“蓬松”

使用 ActiveRecord 编写这个最有效的方法是什么?使用直接 SQL 会如下所示:

select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    这应该有效:

    User.joins(:pets).where("pets.name != 'fluffy'")
    

    您可能还想阅读官方 RoR 指南中的 following part(joins)。

    【讨论】:

    • 如果我错了请纠正我,但它不会是 'User.joins(:pet)...' - 单数 - 对于符号参数?
    • @jeffdill2 这取决于关联是如何定义的。如果用户has_one :pet,例如,你是对的。
    【解决方案2】:

    没有 SQL 注入漏洞的最干净的方法是使用查询参数:

    User.joins(:pets).where("pets.name != ?", "fluffy")
    

    一些数据库驱动程序将利用上述准备好的语句来重用数据库查询计划。在这种情况下,只有参数值变化时,数据库不必再次分析查询。

    【讨论】:

      【解决方案3】:

      在 rails 4 中,您可以更清楚地说明这一点:

      User.joins(:pets).where.not(pets: { name: 'fluffy' })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        相关资源
        最近更新 更多