我看一下这两篇博文,并对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:artist 和 t引用2表艺术家和歌曲。参考:歌曲。如果我们想要访问乐器艺术家为该歌曲播放的属性,我们可以使用连接表贡献来访问它。
在第二篇文章中: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
...........
因此,成熟表的迁移将引用2表类别和项目 t.integer:category_id 和 t.integer:item_id 。我们只能访问特定于与该表的2个属性相关的内容的属性,如时间戳,我们可以向模型添加更多属性(如 t.string:instrument ),如上所述?
例如,如果我有多对多关系模型,例如制造商和产品,我想跟踪价格 ,我应该把它放到完整的表中,对吗?但是,如果我只想添加一个属性但不跟踪 Original_From (显示产品的生产地点),我只需要放入连接表吗?
我可以通过这种方式进行概括:当属性数量有限且跟踪不重要时,请使用连接表。当属性数量很多并且我们想要跟踪时,我们将使用完整的表格。这是对的吗?
访问数据时有何不同?就像我想要访问上面例子中的价格或位置一样?
我还不清楚完整表和连接表之间的区别。请给我一些想法。非常感谢你!
答案 0 :(得分:0)
我认为你这个大多数都是正确的。 {+ 1}}(HABTM)在多对多关系的两个模型上假设一个简单的连接表(没有id,没有时间戳,只是每个表的主键的外键。)
如果关系本身(连接表)是“有用的” - 你想在类中引用的东西,特别是因为它有自己的字段,你可以将它定义为自己的模型并使用{ {1}}在新模型中使用has_and_belongs_to_many
来定义双方的关系。这是“完全成熟”的选择。
大多数情况下,您可以使用任一选项获得相同的方法(例如,您将在Price上获得has_many :through =>
方法,在位置上获得belongs_to
方法。但肯定HABTM选项更有限。
例如,我最近发现locations
方法不适用于简单的HABTM,但适用于prices
。
我认为这是Rails guide does a really good job of describing when to use one versus the other。
(看起来即将推出的Rails 4.0对HABTM有更好的支持,以及一些处理一对多和多对多关系的新功能: - )