Ruby on rails 是否需要为HABTM联接表手动创建迁移?

Ruby on rails 是否需要为HABTM联接表手动创建迁移?,ruby-on-rails,Ruby On Rails,我现在正在努力使HATBM正常工作。我有一本书:文章和标签。我想,这里应该使用HABTM,因为它是一种多对多关系。 但是,我不知道是否应该手动创建联接表(在本例中是articles\u标记) 我目前的代码如下: class Article < ActiveRecord::Base has_and_belongs_to_many :tags end class Tag < ActiveRecord::Base has_and_belongs_to_many :articl

我现在正在努力使HATBM正常工作。我有一本书:文章和标签。我想,这里应该使用HABTM,因为它是一种多对多关系。 但是,我不知道是否应该手动创建联接表(在本例中是articles\u标记)

我目前的代码如下:

class Article < ActiveRecord::Base
  has_and_belongs_to_many :tags  
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles
end
类文章
当我运行迁移时,没有创建第三个表。 另外,我想补充一点,我的第三个表没有任何域逻辑,只是盲赋值


我使用的是Rails 2.2.2

您应该在其中一个表的迁移中执行此操作,如果已经运行了这些迁移,则应在单独的迁移中执行此操作:

create_table :articles_tags, :id => false do |t|
  t.references :article, :tag
end

add_index :articles_tags, [:article_id, :tag_id]
这将为您创建表,
:id=>false
告诉Rails不要向该表添加id字段。还有一个索引,它将加快此联接表的查找速度

您还可以为此生成模型(ArticlesTag),并执行以下操作:

# article.rb
has_many :articles_tags
has_many :tags, :through => :articles_tags

# tag.rb
has_many :articles_tags
has_many :articles, :through => :articles_tags

# article_tag.rb
belongs_to :tag
belongs_to :article

然后在从
脚本/generate model articles\u标记生成的迁移中创建表。

您可能还希望向迁移添加索引:

添加索引“文章标签”、“文章id”

添加索引“文章标签”、“标签id”

但是,如果您想要标签功能,我建议您使用acts_as_taggable_on rails插件:

我在一个项目中使用过它,它很容易实现


用于标记的联接表的一个问题是,为您希望进行标记的每种内容类型创建联接表(即,注释标记、帖子标记、图像标记等)很容易出错。此插件使用一个包含鉴别器的标记表来确定内容类型,而无需为每种类型指定一个特定的联接表。

请注意,API中已经介绍了这一点


结合本节(第一套安斯韦)和第二套安斯韦,即使是猴子也必须理解它。我是RoR的新手,它工作起来很有魅力

谢谢,雷达,这正是我需要的!有趣的是,官方指南或文件没有说明这一点。我得挖一挖。Ty.如果您想将它们与联接的唯一名称关联起来,因为该联接已被使用,该怎么办?我认为您应该在
change
method结尾之前添加索引到联接表,方法是添加
add\u index:articles\u标记,[:article\u id,:tag\u id]
,而不是:articles\u标记(单数)在模型中,迁移方法引用(或属于)自动添加索引。你不需要那个。您可以用它中断迁移。迁移方法引用(或所属)实际上不会自动添加索引。(我想是这样的:-)我想最好创建一个复合主键。但是它是特定于数据库的。虽然应该在某个地方的指南中提及它。阅读API中的这几行,以便理解表的预期名称(例如,当使用相同前缀时)。这将解释@Giovanni的评论。即使在rails 4中,我猜答案是。。。。“是吗”?:(@dtc,仍然是,仍然是。