2017-08-10 157 views
1

这里是我在我的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}) 

回答

0

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

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

+1

这正是我想查询的内容。注意到你必须否定 - 谢谢你这样彻底的回答! – Layla