创建链接表的最佳方法是什么?

时间:2009-08-21 04:01:44

标签: ruby-on-rails database-design

Rails还是新手。

我确定我在这里尝试做的是一个命名约定。

你有帖子,然后你就有了标签(我实际上并没有制作博客,但我们都熟悉这种情况)。

我设置了这样的标签:

ruby script/generate scaffold tag name:string

然后我会创建一个这样的链接表:

ruby script/generate migration x_tag_post tag_id:integer post_id:integer

那么在模型中我会有xTagAsset

belongs_to :tags
belongs_to :posts

然后在标签帖子中我会说

has_many :x_tag_posts

这是正确的方法吗?我觉得有更好的东西。

3 个答案:

答案 0 :(得分:5)

您需要使用内置的Active Record has_and_belongs_to_manyhas_many :through =>选项

HABTM假设存在一个遵循一些基本约定的表,并允许您使用:

class Tags < ActiveRecord::Base 
  has_and_belongs_to_many :assets 
end 

class Asserts < ActiveRecord::Base 
  has_and_belongs_to_many :tags 
end 

有很多人通过明确声明加入表:

class Tags < ActiveRecord::Base 
  has_many :assets, :through => "assets_tags"
end 

class Asserts < ActiveRecord::Base 
  has_many :tags, :through => "assets_tags"
end 

我上面链接的指南详细介绍了实施情况。

答案 1 :(得分:1)

我更喜欢the has many through association,就像Toby Hede写的那样。

class Post < ActiveRecord::Base 
  has_many :assets  
  has_many :tags, :through => :assets 
end

class Asset < ActiveRecord::Base 
  belongs_to :post  
  belongs_to :tag
end 

class Tag < ActiveRecord::Base 
  has_many :assets
  has_many :posts, :through => :assets
end 

希望这会有所帮助:)

答案 2 :(得分:0)

从纯粹的数据库角度来看,您创建了一个名为PostTag的表,它看起来像这样。 (这是SQL Server语法,YMMV。)

CREATE TABLE PostTag
(PostId INT,
TagId INT
CONSTRAINT PK_PostTag PRIMARY KEY (PostId, TagId))