Rails模型,属于很多

ard*_*vis 23 ruby-on-rails associations model-associations ruby-on-rails-3

我很难弄清楚如何将我的一个模型与另一个模型联系起来.

就像现在一样,我有:

class ModelA < ActiveRecord::Base
  has_many :model_b
end

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end
Run Code Online (Sandbox Code Playgroud)

但是...... ModelB不仅需要属于ModelA的一个实例,而且可能属于三个.我知道有一个has_many:through,但我不确定它在这种情况下会如何起作用.ModelA的每个实例总是会有三个ModelB实例.但如前所述,ModelB不仅可以属于ModelA的一个实例.

Jai*_*yer 47

rails中的多对多关系不使用belongs_to.相反,您想要使用几个选项中的一个.首先是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
Run Code Online (Sandbox Code Playgroud)

并且您需要在数据库中添加额外的连接表,并进行如下迁移:

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
Run Code Online (Sandbox Code Playgroud)

您可以看到连接表的名称是其他两个表名称的组合.这些表必须按照上面的字母顺序提及,并且:id => false需要存在,因为我们不希望在该表上使用主键.它将打破轨道协会.

还有另一种更复杂的方法,has_many :through就像你需要存储关系本身的信息一样.我写了一篇完整的文章,详细介绍了如何使用这两种方法,以及何时使用每种方法:

Rails中基本的多对多关联

我希望这有帮助,如果您有任何其他问题,请与我联系!


Roh*_*hit 31

这就是@Jaime Bellmyer使用的

# 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
Run Code Online (Sandbox Code Playgroud)

我建议使用这个

# 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
Run Code Online (Sandbox Code Playgroud)

如果你使用这个,你将有一个连接模型,它可以让你更好地控制处理类别和项目.但是使用@Jaime建议你只有一个连接表,而不是一个不受控制的模型.