Ruby on rails 获取所有不带附件的记录
给出了一个带有ActiveStorage的模型Ruby on rails 获取所有不带附件的记录,ruby-on-rails,ruby,rails-activestorage,Ruby On Rails,Ruby,Rails Activestorage,给出了一个带有ActiveStorage的模型 课堂报告 有一个:报告文件 结束 类报告文件 属于:报告 附件:文件 结束 如何获取ReportFile中未附加文件的所有报告 Report.eager_load(:report_file).where(report_file: {file: nil}) “应能工作”附件关联具有以下命名约定:\u附件。在您的情况下,这将是文件附件 因为这是一个常规的ActiveRecord关联,所以您可以使用它进行连接。那么,您要查找的查询是: Record.
课堂报告
有一个:报告文件
结束
类报告文件
属于:报告
附件:文件
结束
如何获取ReportFile中未附加文件的所有报告
Report.eager_load(:report_file).where(report_file: {file: nil})
“应能工作”附件关联具有以下命名约定:\u附件。在您的情况下,这将是文件附件 因为这是一个常规的ActiveRecord关联,所以您可以使用它进行连接。那么,您要查找的查询是:
Record.where(id: RecordFile.where.not(id: RecordFile.joins(:file_attachment)).pluck(:record_id))
Report.includes(:Report\u files).where('Report\u files.file=?',nil)
参考:
Rails 5中有
left_joins
方法,因此您可以使用此方法来代替includes
(或渴望加载
,其工作方式与此相同),因为它更适合这种情况。此外,要获得所需内容,您真正应该加入的表是活动存储\u附件
,它与文件\u附件
关联到报告文件
。因此,我认为得到你想要的最好的方法是:
Report.left_joins(report_file: :file_attachment).where(active_storage_attachments: { id: nil })
将起作用
report\u files
查询中的表名不起作用,在report\u files
table中没有file
这样的列。同意。这个想法更倾向于使用“includes”,我们可以根据activestorage生成的列将where条件更改为
Report.joins("left join report_files on reports.id = report_files.report_id").where("report_files.file is null")