From 51ba56e8a3142e9e6a1da1bd2301cf3e4000f24d Mon Sep 17 00:00:00 2001 From: evazion Date: Tue, 8 Feb 2022 19:04:44 -0600 Subject: [PATCH] Fix #5001: Media assets not searchable through upload records. Fix this: https://danbooru.donmai.us/uploads.json?search[media_assets][md5]=b83daa7f1ae7e4127b1befd32f71ba10 failing with an ActiveRecord::StatementInvalid error. The bug was that for a `has_many through: ...` association, like `has_many :media_assets, through: :upload_media_assets`, we weren't joining on the associated table properly so we ended up generating invalid SQL. --- app/logical/concerns/searchable.rb | 2 +- app/models/upload_media_asset.rb | 5 +++++ test/unit/concerns/searchable.rb | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/logical/concerns/searchable.rb b/app/logical/concerns/searchable.rb index 139968424..1e7d154e3 100644 --- a/app/logical/concerns/searchable.rb +++ b/app/logical/concerns/searchable.rb @@ -436,7 +436,7 @@ module Searchable end if parameter_hash?(params[attr]) - relation = relation.where(attr => model.visible(current_user).search(params[attr]).reorder(nil)) + relation = relation.includes(attr).references(attr).where(attr => model.visible(current_user).search(params[attr]).reorder(nil)) end relation diff --git a/app/models/upload_media_asset.rb b/app/models/upload_media_asset.rb index 9ff3b3a6c..64705e2be 100644 --- a/app/models/upload_media_asset.rb +++ b/app/models/upload_media_asset.rb @@ -3,4 +3,9 @@ class UploadMediaAsset < ApplicationRecord belongs_to :upload belongs_to :media_asset + + def self.search(params) + q = search_attributes(params, :id, :created_at, :updated_at, :upload, :media_asset) + q.apply_default_order(params) + end end diff --git a/test/unit/concerns/searchable.rb b/test/unit/concerns/searchable.rb index 0d6fd85a5..d640e5f6a 100644 --- a/test/unit/concerns/searchable.rb +++ b/test/unit/concerns/searchable.rb @@ -252,5 +252,17 @@ class SearchableTest < ActiveSupport::TestCase assert_search_equals(@p1, has_comments: true, comments: { id: @p1.comments.first.id }) end end + + context "for a `has_many through: ...` association" do + subject { Upload } + + should "work" do + @media_asset = create(:media_asset) + @upload1 = create(:upload, media_assets: [@media_asset]) + @upload2 = create(:upload, media_assets: [@media_asset]) + + assert_search_equals([@upload2, @upload1], media_asset: { md5: @media_asset.md5 }) + end + end end end