2009-08-21 108 views
1

还是新轨。什么是创建链接表的最佳方式?

我敢肯定,这里有一个命名规则,我想在这里做。

你有帖子,然后你有标签(我没有真正做一个博客,但这是一个我们都熟悉的场景)。

我建立了我的标签是这样的:

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 

这是正确的方法吗?我有一种感觉,有更好的东西。

回答

5

您需要使用内置的活动记录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 

我已经连接到上面的导游对实施更多细节。

+0

谢谢。我忘了我重新命名“资产”到“上岗”的问题(woops),那么无论你有资产在那里,应该可能是帖子。再次感谢,这正是我正在寻找的。 – 2009-08-21 17:20:33

+0

HABTM不支持'dependent :: destroy',这样就限制了它的使用 – Xitcod13 2014-03-15 16:24:09

+0

实际上你的类名是Asserts,而不是Assets。 – Joe 2017-12-06 03:41:07

0

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

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

谢谢,我已经做到了这一点经常外面的Rails - 我更感兴趣的是如何根据Rails惯例去做。 – 2009-08-21 04:24:38

+0

另外,如果您使用的是迁移到添加连接表请务必排除“id”主键=>“CREATE_TABLE:posts_tags,:ID =>假办|表|” – askegg 2009-08-21 05:15:53

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 

希望这将有助于:)

相关问题