I'm using acts-as-taggable-on and I would like to search on tags that might be in a model or its association.
class Event < ApplicationRecord
acts_as_taggable_on :mentions
belongs_to :establishment
end
class Establishment < ApplicationRecord
acts_as_taggable_on :hashtags
end
I'm trying to search with a LIKE on tags values. I'm stuck with ActiveRecord naming of the joins.
Event.left_joins([:mentions]).to_sql
#=> SELECT "events".* FROM "events" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_type" = 'Event' AND "taggings"."context" = 'mentions' AND "taggings"."taggable_id" = "events"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id"
# name is "tags" for "mentions"
Event.left_joins([:mentions], {:establishment=>[:hashtags]}).to_sql
#=> SELECT "events".* FROM "events" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_type" = 'Event' AND "taggings"."context" = 'mentions' AND "taggings"."taggable_id" = "events"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" LEFT OUTER JOIN "establishments" ON "establishments"."id" = "events"."establishment_id" LEFT OUTER JOIN "taggings" "hashtag_taggings_establishments_join" ON "hashtag_taggings_establishments_join"."taggable_type" = 'Establishment' AND "hashtag_taggings_establishments_join"."context" = 'hashtags' AND "hashtag_taggings_establishments_join"."taggable_id" = "establishments"."id" LEFT OUTER JOIN "tags" "hashtags_establishments" ON "hashtags_establishments"."id" = "hashtag_taggings_establishments_join"."tag_id"
# name is "tags" for "mentions" and "hashtags_establishments" for hashtags in establishment
Event.left_joins({:establishment=>[:hashtags]}).to_sql
#=> SELECT "events".* FROM "events" LEFT OUTER JOIN "establishments" ON "establishments"."id" = "events"."establishment_id" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_type" = 'Establishment' AND "taggings"."context" = 'hashtags' AND "taggings"."taggable_id" = "establishments"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id"
# name is "tags" for "hashtags" in establishment
If there is only one join, text value are in tags.name but if there are more than one join, in my case, it's "#{tag_association}_#{model_name.pluralize}.name".
I would like to force a name to be 100% sure of where I'm searching on without having to count how many joins I have to guess the name.