ActiveRecord left_joins naming

Viewed 23

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.

0 Answers
Related