以下是我在 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] 删除。
我来说两句