Rails 4 Filtering on has_many through associations

Hi All,

I have an issue on filtering a has_many through association. My model is as follows

class Group

has_and_belongs_to_many :messages

has_many :tags, through :messages

end

class Message

has_and_belongs_to_many :tags

end

class Tag

has_and_belongs_to_many :messages

end

This gives me the tags for all messages in a group. Groups.first.tags . However I want to filter on an attribute in messages (Message.where(:created => ‘11-11-2014’)) based on which tags should be retrieved. Is it possible to do this in a has_many though association? Thanks in advance

Thanks,

Ganesh

Hi All,

I have an issue on filtering a has_many through association. My model is as follows

class Group    has_and_belongs_to_many :messages    has_many :tags, through :messages end

class Message    has_and_belongs_to_many :tags end

class Tag   has_and_belongs_to_many :messages end

This gives me the tags for all messages in a group. Groups.first.tags . However I want to filter on an attribute in messages (Message.where(:created => '11-11-2014')) based on which tags should be retrieved. Is it possible to do this in a has_many though association? Thanks in advance

Groups.first.messages.where(:created => '11-11-2014').tags

By the way, if you mean :created_at then this will not work as created_at includes the time, so to get an exact match on 11-11-2014 it would have to be exactly midnight. You will have to use a time range, and don't forget to watch out for the timezone.

Colin

​Hi Colin,

Thanks for your reply. This won't work since messages would return an ActiveRelation there is no tags method on an active relation.

In my actual code I will use a between two days. I just used a direct equals for simplicity sake​

Thanks, Ganesh

​Hi Ganesh,

I tried various scope syntaxes but it didn't work. :frowning:

Can you point me in the right direction,

Thanks, Ganesh​

You are right of course.

Colin

​I got the answer from another mailing list. Created a static method on the Tag model

def self.for_groupmessages_created_on(group_id,fromdate,todate)                 Tag.joins(:messages, :groups).where(                         messages: {                                 created: fromdate..todate                         },                         groups: {                                 id: group_id                         }

)

Thanks, Ganesh​