Rails Model, belongs to many

前端 未结 2 1355
[愿得一人]
[愿得一人] 2020-12-24 07:02

I\'m having a hard time figuring out how to association one of my models with multiple of another.

As it is now, I have:

class ModelA < ActiveReco         


        
相关标签:
2条回答
  • 2020-12-24 07:25

    This is what @Jaime Bellmyer used

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_and_belongs_to_many :items
    end
    
    # app/models/item.rb
    class Item < ActiveRecord::Base
      has_and_belongs_to_many :categories
    end
    

    I would recommend using this

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_many :category_items
      has_many :items, :through => :category_items
    end
    
    # app/models/item.rb
    class Item < ActiveRecord::Base
      has_many :category_items
      has_many :categories, :through => :category_items
    end
    
    # app/models/category_items.rb
    class CategoryItems < ActiveRecord::Base
      belongs_to :category
      belongs_to :items
    end
    

    If you use this you will have a join model which will give you more control over handling Category and Item. But using what @Jaime suggested you will have only a join table and not a model, which will not be under control.

    0 讨论(0)
  • 2020-12-24 07:40

    Many-to-many relationships in rails don't use belongs_to. Instead, you want to use one of a couple options. The first is has_and_belongs_to_many:

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_and_belongs_to_many :items
    end
    
    # app/models/item.rb
    class Item < ActiveRecord::Base
      has_and_belongs_to_many :categories
    end
    

    And you'll need to add an extra join table in your database, with a migration like this:

    class AddCategoriesItems < ActiveRecord::Migration
      def self.up
        create_table :categories_items, :id => false do |t|
          t.integer :category_id
          t.integer :item_id
        end
      end
    
      def self.down
        drop_table :categories_items
      end
    end
    

    You can see that the join table's name is the combination of the two other tables' names. The tables must be mentioned in alphabetical order as above, and the :id => false needs to be there, since we don't want a primary key on this table. It will break the rails association.

    There's also another, more complex method known as has_many :through if you need to store info about the relationship itself. I've written a whole article detailing how to do both methods, and when to use each:

    Basic many-to-many Associations in Rails

    I hope this helps, and contact me if you have any other questions!

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