Search code examples
ruby-on-railsmodelsmany-to-onetable-relationships

Rails ActiveRecord relationships - has many and belongs to associations


I've created 3 models:

  • Article: contains an article
  • Tag: contains tags
  • ArticleTag: meant for associating a many-to-one tags to article relationship. It contains a tag_id and an article_id.

The problem I'm having is I'm fairly new to the active record technology and I don't understand the proper way to define everything. Currently, which I think is wrong, is I have a

ArticleTag
 belongs_to :article
 belongs_to :tag

Now, from here my thought was to then add

  Article
   :has_many :tag

I'm not sure if im approaching this correctly at all. Thanks for the help!


Solution

  • It depends whether you want a join model or not. A join model lets you hold extra information against the association between two other models. For example, perhaps you want to record a timestamp of when the article was tagged. That information would be recorded against the join model.

    If you don't want a join model, then you could use a simple has_and_belongs_to_many association:

    class Article < ActiveRecord::Base
      has_and_belongs_to_many :tags
    end
    
    class Tag < ActiveRecord::Base
      has_and_belongs_to_many :articles  
    end
    

    With a Tagging join model (which is a better name than ArticleTag), it would look like this:

    class Article < ActiveRecord::Base
      has_many :taggings
      has_many :tags, :through => :taggings
    end
    
    class Tag < ActiveRecord::Base
      has_many :taggings
      has_many :articles, :through => :taggings  
    end
    
    class Tagging < ActiveRecord::Base
      belongs_to :article
      belongs_to :tag
    end