【问题标题】:Do I need to manually create a migration for a HABTM join table?我是否需要手动为 HABTM 连接表创建迁移?
【发布时间】:2009-02-19 07:41:45
【问题描述】:

我现在正在努力让 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

当我运行迁移时,没有创建第三个表。 另外,我想补充一点,我的第三张表不承担任何领域逻辑,只是盲目分配。

我正在使用 Rails 2.2.2

【问题讨论】:

  • 即使在rails 4,我猜这个答案是......“是”? :(
  • @dtc,仍然是,仍然正确。

标签: ruby-on-rails


【解决方案1】:

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

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

add_index :articles_tags, [:article_id, :tag_id]

这将为您创建表,:id =&gt; 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。泰。
  • 如果您想将它们与连接的唯一名称相关联,因为该连接已被使用。
  • 我认为您应该通过在 change 方法结束之前添加 add_index :articles_tags, [:article_id, :tag_id] 来为联接表添加索引
  • 模型中不应该是:articles_tag(单数)吗?
【解决方案2】:

【讨论】:

  • 虽然它应该在某个地方的指南中提及。
  • 阅读 API 中的这几行,以便了解表的预期名称(例如,使用相同前缀时)。这将解释@Giovanni 的评论。
【解决方案3】:

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

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/

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

用于标记的连接表的一个问题是,为您希望使其可标记的每种内容类型(即 cmets_tags、posts_tags、images_tags 等)创建一个连接表很容易变得难看。该插件使用包含鉴别器的标记表来确定内容类型,而无需为每种类型提供特定的连接表。

【讨论】:

  • 迁移方法引用(或belongs_to)自动添加索引。你不需要那个。你可以用它来中断你的迁移。
  • 迁移方法引用(或belongs_to)确实不会自动添加索引。 (认为​​他们这样做:-)
  • 恕我直言,最好创建一个复合主键。但它是特定于数据库的。
【解决方案4】:

结合这个 Qeuestion(1st answear) How to set up a typical users HABTM roles relationship 和 1st answear from here,即使是猴子也必须理解。我是 RoR 的新手,它的工作就像一个魅力

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2021-08-17
    • 2011-07-01
    • 1970-01-01
    • 2018-02-28
    • 2013-07-19
    • 2011-08-21
    • 2021-10-06
    相关资源
    最近更新 更多