访问HABTM连接表记录

时间:2015-02-23 18:34:55

标签: ruby-on-rails ruby-on-rails-4 join many-to-many rails-console

我的应用程序中有一个HABTM关系,如下所示:

class Book < ActiveRecord::Base
  has_and_belongs_to_many :authors
end

class Author < ActiveRecord::Base
  has_and_belongs_to_many :books
end

在rails控制台中,我可以像这样访问Book和Author的记录:

Book.all
Book.first
b = Book.first
b.title = "Title2"
b.save
...

但我不知道如何访问联接表。

如何访问和查看联接表books_authors中的记录?

是否可以更改连接表行?

1 个答案:

答案 0 :(得分:4)

如果要访问联接表记录,则必须使用has-many-through关系重新创建此记录。这是一个很好的指南,以及has-many-throughhas-and-belongs-to-many之间的差异,这里:http://railscasts.com/episodes/47-two-many-to-many

您需要创建一个新的迁移,如下所示,以创建连接表:

class Authorships < ActiveRecord::Migration
  def change
    create_table :authorships do |t|
      t.belongs_to :book, index: true
      t.belongs_to :author, index: true

      t.timestamps null: false
    end
    add_foreign_key :authorships, :books
    add_foreign_key :authorships, :authors
  end
end

其中'作者'可以是您认为适合加入表的任何名称(如果您想坚持使用,可以是'BookAuthors')。

作为一个简单示例,您的模型可能如下所示:

class Book < ActiveRecord::Base
  has_many :authorships
  has_many :authors, through: :authorships
end

class Author < ActiveRecord::Base
  has_many :authorships
  has_many :books, through: :authorships
end

class Authorship < ActiveRecord::Base
  belongs_to :book
  belongs_to :author
end

您可以在连接表中添加额外的列,并根据需要访问它们,添加后再添加authorship_idsAuthor.first.books / Book.first.authors

希望这很有用!