【问题标题】:Ruby multiple joinsRuby 多连接
【发布时间】:2017-08-10 20:57:45
【问题描述】:

这是我在 Rails 应用中创建的模型:

class Pet < ActiveRecord::Base
  belongs_to :shelter
  belongs_to :type
end

class Shelter < ActiveRecord::Base
  has_many :pets
end

class Type < ActiveRecord::Base
  has_many :pets
end

我正在尝试寻找其中没有任何外来宠物的庇护所,但我被困在无法检索这些信息的方式中加入表格!这是我最近的尝试,我相信我至少已经达到了 Types 表。任何有关联接的帮助和解释将不胜感激!

Shelter.joins(:pet => :type).where(:types => {exotic => false})

【问题讨论】:

    标签: ruby-on-rails join activerecord


    【解决方案1】:

    我相信仅仅使用 JOINS 是不可能得到你想要的结果的。相反,您需要找出哪些收容所确实有外来宠物,然后否定它。

    实现这一点的一种方法是通过子查询:

    Shelter.where(<<~SQL)
      NOT EXISTS (
        SELECT 1 FROM pets 
        INNER JOIN types ON types.id = pets.type_id 
        WHERE shelters.id = pets.shelter_id 
          AND types.exotic IS TRUE
      )
    SQL
    

    当然这涉及到很多显式的 SQL,我不介意,但其他人不喜欢它。

    您也可以仅使用 ActiveRecord 查询界面执行类似操作。

    shelters_with_exotics = Shelter.joins(pets: :type).where(types: { exotic: true })
    Shelter.where.not(id: shelters_with_exotics)
    

    注意:这两个示例的查询是不同的。如果这很重要,您需要对它们进行基准测试,以确定哪一个表现最好。

    【讨论】:

    • 这正是我想要查询的。注意到你必须否定 - 谢谢你这么彻底的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2014-01-18
    • 2011-09-15
    • 2011-07-01
    相关资源
    最近更新 更多