Mysql 有多个关联加载不完整的结果

Mysql 有多个关联加载不完整的结果,mysql,ruby-on-rails,associations,rails-activerecord,has-and-belongs-to-many,Mysql,Ruby On Rails,Associations,Rails Activerecord,Has And Belongs To Many,我有两种型号 class Activity has_and_belongs_to_many :photos, -> { where "deleted = false"} end class Photo has_and_belongs_to_many :activities end 让我们假设我只有一个活动,它有两张照片 当我尝试加载活动列表并急切加载其相应的照片时,每个活动只返回一张照片 activities = Activity.all.includes(:photos)

我有两种型号

class Activity
  has_and_belongs_to_many :photos, -> { where "deleted = false"}
end

class Photo
  has_and_belongs_to_many :activities
end
让我们假设我只有一个活动,它有两张照片

当我尝试加载活动列表并急切加载其相应的照片时,每个活动只返回一张照片

activities = Activity.all.includes(:photos)

a.first.id # => 1
a.first.photos.size   # => 1
相应的SQL查询运行如下

SELECT `activities`.* FROM `activities`
SELECT `activities_photos`.*, `activities_photos`.`activity_id` AS t0_r0, `activities_photos`.`photo_id` AS t0_r1, `photos`.`id` AS t1_r0, `photos`.`primary_photo` AS t1_r1, `photos`.`created_at` AS t1_r2, `photos`.`updated_at` AS t1_r3, `photos`.`deleted` AS t1_r4, `photos`.`url` AS t1_r5, `photos`.`thumbnail_url` AS t1_r6 FROM `activities_photos` LEFT OUTER JOIN `photos` ON `photos`.`id` = `activities_photos`.`photo_id` WHERE (deleted = false) AND `activities_photos`.`activity_id` IN (1)
SELECT `activities`.* FROM `activities`
SELECT `photos`.* FROM `photos` INNER JOIN `activities_photos` ON `photos`.`id` = `activities_photos`.`photo_id` WHERE `activities_photos`.`activity_id` = ? AND (deleted = false)  [["activity_id", 1]]
第二个查询在MYSQL中运行时返回2行

对吗

这就是它变得更加脆弱的地方

我不急于加载“照片”,而是为每个活动单独加载

activities = Activity.all

a.first.id # => 1
a.first.photos.size # => 2
所以这次我得到了所有需要的数据

相应的SQL查询运行如下

SELECT `activities`.* FROM `activities`
SELECT `activities_photos`.*, `activities_photos`.`activity_id` AS t0_r0, `activities_photos`.`photo_id` AS t0_r1, `photos`.`id` AS t1_r0, `photos`.`primary_photo` AS t1_r1, `photos`.`created_at` AS t1_r2, `photos`.`updated_at` AS t1_r3, `photos`.`deleted` AS t1_r4, `photos`.`url` AS t1_r5, `photos`.`thumbnail_url` AS t1_r6 FROM `activities_photos` LEFT OUTER JOIN `photos` ON `photos`.`id` = `activities_photos`.`photo_id` WHERE (deleted = false) AND `activities_photos`.`activity_id` IN (1)
SELECT `activities`.* FROM `activities`
SELECT `photos`.* FROM `photos` INNER JOIN `activities_photos` ON `photos`.`id` = `activities_photos`.`photo_id` WHERE `activities_photos`.`activity_id` = ? AND (deleted = false)  [["activity_id", 1]]
如何通过快速加载获取所有照片


我是做错了什么还是有什么奇怪的错误?

->{where“deleted=false”}
更改为
->{where(deleted:false)}
;使用
activities=Activity.includes(:照片).all
;让我知道它是否修复了您的问题活动。包括(:照片)。所有都提供相同的输出。我面临的另一个问题是,更改为{where(deleted:false)}会导致ActiveRecord::StatementInvalid exception-“where子句中的未知列'photos.deleted':从
activities\u photos
where
photos
deleted=0和
activities\u photos
activity\u id
中选择
*。”…当我在where条件中使用哈希时,它没有对实际的photos表执行联接。”未知列“photos.deleted”:找到包含
deleted
列的表名,然后将其添加到此处:
->{where(您的表名:{deleted:false})}
这解决了使用哈希的问题。但仍然只得到第一张照片使用渴望加载。