当前位置:  开发笔记 > 后端 > 正文

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

如何解决《我是否需要为HABTM联接表手动创建迁移?》经验,为你挑选了3个好方法。

我现在正努力让HATBM正常工作.我有一个被打败的scanario:文章和标签.我认为,HABTM应该在这里使用,因为它是一种多对多的关系.我不知道是否应该手动创建连接表(在这种情况下为articles_tags).

我的代码目前如下:

class Article < ActiveRecord::Base
  has_and_belongs_to_many :tags  
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :articles
end

运行迁移时,不会创建第3个表.另外,我想补充一点,我的第三个表没有任何域逻辑,只是盲目分配.

我正在使用Rails 2.2.2



1> Ryan Bigg..:

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

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

然后在从script/generate model articles_tag调用生成的迁移中创建表.


有趣的是,官方指南或文档没有说明这一点.我不得不挖掘Stackoverflow.TY.

2> Sai Perchard..:

请注意,这包含在API中.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many



3> Jack Chu..:

您可能还想为迁移添加索引:

add_index"articles_tags","article_id"

add_index"articles_tags","tag_id"

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

http://www.intridea.com/tag/acts_as_taggable_on http://github.com/mbleigh/acts-as-taggable-on/

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

用于标记的连接表的一个问题是,它很容易变得丑陋,为您希望制作标记的每种内容类型创建连接表(即comments_tags,posts_tags,images_tags等).此插件使用标记表,该表包含用于确定内容类型的标识符,而不需要针对每种类型的特定连接表.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有