Do I need to manually create a migration for a HABTM join table?

后端 未结 4 1658
北荒
北荒 2020-12-07 08:27

I\'m struggling now to get HATBM working correctly. I have a beaten scanario: articles and tags. I presume, HABTM should be used here, since it is a many-to-many relationshi

相关标签:
4条回答
  • 2020-12-07 08:58

    Note that this is covered in the API.

    http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

    0 讨论(0)
  • 2020-12-07 09:05

    You probably also want to add an index to the migration:

    add_index "articles_tags", "article_id"

    add_index "articles_tags", "tag_id"

    However, if you want tagging functionality I'd recommend the acts_as_taggable_on rails plugin:

    http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/

    I've used it on a project and it was very easy to implement.

    One of the issues with a join table for tagging is that it can easily get ugly creating a join table for each content type you wish to make taggable (ie. comments_tags, posts_tags, images_tags, etc). This plugin uses a taggings table which includes a discriminator to determine the content type without the need of a specific join table for each type.

    0 讨论(0)
  • 2020-12-07 09:09

    In combination with this Qeuestion(1st answear) How to set up a typical users HABTM roles relationship and 1st answear from here, it has to be understood even by a monkey. I am new in RoR and it's got working like a charm

    0 讨论(0)
  • 2020-12-07 09:10

    You should do this in a migration of one of the tables, or in a separate migration if those migrations have been ran:

    create_table :articles_tags, :id => false do |t|
      t.references :article, :tag
    end
    
    add_index :articles_tags, [:article_id, :tag_id]
    

    This will create the table for you and the :id => false tells Rails not to add an id field to this table. There's an index also, which will speed up lookups for this join table.

    You could also generate a model (ArticlesTag) for this and do:

    # article.rb
    has_many :articles_tags
    has_many :tags, :through => :articles_tags
    
    # tag.rb
    has_many :articles_tags
    has_many :articles, :through => :articles_tags
    
    # article_tag.rb
    belongs_to :tag
    belongs_to :article
    

    And then create the table in the migration generated from the script/generate model articles_tag call.

    0 讨论(0)
提交回复
热议问题