1

我看了这 2 篇博文,对 RoR 中的 has_many 关系感到有些晦涩:

在这个: http: //kconrails.com/2010/01/16/many-to-many-relationships-in-ruby-on-rails/,在“has_many :through”部分,作者说迁移文件连接表贡献是这样的:

class CreateContributions < ActiveRecord::Migration
  def self.up
    create_table :contributions do |t|
      t.references :artist
      t.references :song
      t.string :instrument
      t.timestamps
    end
...........

因此连接表的迁移将使用t.references :artistt.references :song引用 2 个表ArtistSong。如果我们想要访问一个属性,比如该歌曲的乐器艺术家演奏,我们可以使用连接表Contributions访问它。

在第二篇文章中:http: //kconrails.com/2010/01/29/has_and_belongs_to_many-associations-in-ruby-on-rails/部分:“has_many :through”,作者介绍了名为Categorizations的“成熟表” 。迁移如下:

class CreateCategorizations < ActiveRecord::Migration
  def self.up
    create_table :categorizations do |t|
      t.integer :category_id
      t.integer :item_id
      t.timestamps
    end
...........

因此,成熟表的迁移将通过t.integer :category_idt.integer :item_id引用 2 个表 Category 和 Item 。而且我们只能访问与该表的 2 个属性(例如时间戳)相关的特定属性,我们可以像上面那样向模型添加更多属性(例如t.string :instrument)吗?

例如,如果我有制造商产品等多对多关系模型,我想跟踪价格,我应该把它放到完整的表中,对吗?但是如果我只想添加一个属性而不是像Original_From那样跟踪它(显示产品的生产地),我只需要放入连接表吗?

我可以这样概括它:当属性数量有限且不重要时,请使用连接表。当属性的数量很多并且我们想要跟踪时,我们将使用完整的表。这是正确的吗?

当我们访问数据时有什么区别?就像我想访问上面示例中的价格或位置一样?

我仍然不清楚完整表和连接表之间的区别。请给我一些想法。非常感谢你!

4

1 回答 1

0

我认为你基本上是对的。 has_and_belongs_to_many(HABTM)在多对多关系的两个模型上都假设一个简单的连接表(没有 id,没有时间戳,只有每个表主键的外键。)

如果关系本身(连接表)是“有用的”——你想在你的类中引用的东西,特别是因为它有自己的字段,你可以将它定义为它自己的模型并has_many :through =>用来定义关系两侧,belongs_to在新模型中。这是“完全成熟”的选择。

大多数情况下,您将获得与任一选项相同的方法(例如,您将获得一个locations关于价格的prices方法和一个关于位置的方法)。但可以肯定的是,HABTM 选项更加有限。

例如,我最近发现该accepts_nested_attributes_for方法不适用于简单的 HABTM,但适用于has_many :through.

我认为这个 Rails 指南很好地描述了何时使用一个与另一个

(而且看起来即将到来的 Rails 4.0 对 HABTM 有更好的支持,以及一些处理一对多和多对多关系的新特性 :-)

于 2012-11-29T20:51:34.083 回答