Ruby 多重连接

莱拉

以下是我在 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

我正在尝试寻找没有任何异国情调宠物的收容所,但我坚持以我可以检索该信息的方式加入表格!这是我最近的尝试,我相信我至少到达了类型表。任何关于连接的帮助和解释将不胜感激!

Shelter.joins(:pet => :type).where(:types => {exotic => false})
奥兹的巫师

我相信仅使用 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)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章