我现在正努力让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
答案 0 :(得分:140)
您应该在其中一个表的迁移中执行此操作,或者如果已运行这些迁移,则应在单独的迁移中执行此操作:
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
调用生成的迁移中创建表。
答案 1 :(得分:8)
请注意,这包含在API中。
答案 2 :(得分:7)
您可能还想为迁移添加索引:
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等)。此插件使用标记表,该表包含一个鉴别器,用于确定内容类型,而无需为每种类型使用特定的连接表。
答案 3 :(得分:1)
结合这个问题(第一个答案)How to set up a typical users HABTM roles relationship和第一个答案,即使是猴子也必须理解。我是RoR的新手,它的工作就像一个魅力