代码之家  ›  专栏  ›  技术社区  ›  Thierry Lam

如何在Rails中创建和使用连接表?

  •  1
  • Thierry Lam  · 技术社区  · 14 年前

    我有以下数据:

    1. 一个帖子 Hello 有类别 greet
    2. 另一个帖子叫 Hola 有类别 greet, international

    我的模式是:

    create_table "posts", :force => true do |t|
      t.string "name"
      t.datetime "created_at"
      t.datetime "updated_at"
    end
    
    create_table "categories", :force => true do |t|
      t.string   "name"
      t.datetime "created_at"
      t.datetime "updated_at"
    end
    
    create_table "posts_categories", :force => true do |t|
      t.integer  "post_id"
      t.integer  "category_id"
      t.datetime "created_at"
      t.datetime "updated_at"
    end
    

    在阅读了Rails指南之后,上述最适合的关系似乎是:

    class Post < ActiveRecord::Base
      has_and_belongs_to_many :categories
    end
    
    class Category < ActiveRecord::Base
      has_and_belongs_to_many :posts
    end
    

    我的接线台似乎也有一把钥匙。我想我得把它处理掉。

    1. 在Rails中生成连接表的初始迁移命令是什么?
    2. 我应该放弃什么样的行动 posts_categories 重新创建它还是只删除主键列?
    3. 接线台有相应的型号吗?我已经用过 scaffold 要生成连接表代码,我应该去掉多余的代码吗?

    假设以上所有内容都已修复并且工作正常,那么如何查询所有文章并在视图中显示它们及其命名类别。例如:

    Post #1 - hello, categories: greet
    Post #2 - hola, categories: greet, international
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   Alex V    9 年前

    你可能想退房 this web page 来自Rails API文档。

    1. 生成连接表的最简单方法是 "script/generate model categories_posts category_id:integer post_id:integer" . 注意类名应该按字母顺序排列。我对整个主键相当漠不关心,但是如果它成为一个问题,您可以生成一个迁移来删除,比如“script/generate droppostcategories-sfrompostcategories-posts-categories-id:integer”(确保这个迁移文件做了您想要的,我没有测试过它,它做的可能会因您的Rails版本而异),然后执行该操作。 rake db:migrate .更改数据库。

    2. 对于正在使用的类名,可以使用:

    class Post < ActiveRecord::Base
       has_many :categories, :through => :posts_categories
    end

    has many through允许您指定联接/连接表的名称。或者您可以删除该表并用正确的名称重新生成它。

    1. (应该是3)是的,只是为一个连接类生成一个模型,不要做整个脚手架。(见上文)

    要找到所有帖子,请执行以下操作 @posts = Post.find(:all)

    要打印出类别,请执行以下操作

    @posts.each do | post |
       print post.name, "\n"
       @posts.categories.each do | cat |
            print "\t", cat.name, "\n"
       end
    end
    

    在实际的Rails代码中,您希望在视图中这样做,这更像是控制台输出类型的事情。