如何在Rails中做多对多的关系?

时间:2013-10-28 09:49:28

标签: ruby-on-rails database

在Rails中做多对多的正确方法是什么?

我浪费了一点时间来解决这个问题的微妙之处,所以我想我会在这里发布问题和答案,以防止其他人节省一些时间。

1 个答案:

答案 0 :(得分:0)

我在这里发布了这个问题,因为它没有立即显现出来。所以我想确定其他人是否在同一个泡菜中,这有望帮助他们。

首先使用Rails为Rails的新用户...当你生成一个模型,例如“故事”时,生成器会在创建数据库的表名时复数模型,例如“故事”。因此,例如当我运行“rails g model author_book”时,模型最终称为AuthorBook,rails命名表author_books。

在选择模型名称时请记住这一点,因为最初“故事”被命名为“新闻”,这违反了以单数形式命名的模型的轨道约定。

还有另一个注意事项:没有很长的模型和主键名称,因为当rails连接数据库中的多对多关系时,它可能会导致问题,因为它限制为最多64个字符(来自我的记得)。

因此,举例来说,我们有书籍和作者以及它们之间的关系。以下是它们在rails中的表示方式:

应用/模型/ book.rb

class Book < ActiveRecord::Base
  attr_accessible :title
  has_many :author_books        #This is the database table name!!
  has_many :authors, through:   #This is the database table name!!
end

应用/模型/ author.rb

class Author < ActiveRecord::Base
  attr_accessible :name
  has_many :author_books                    #This is the database table name!!
  has_many :books, through: :author_books   #This is the database table name!!
end

应用/模型/ author_book.rb

class AuthorBook < ActiveRecord::Base
  attr_accessible :author_id, :book_id
  belongs_to :author                            #This is the MODEL name
  belongs_to :book                              #This is the MODEL name
end

20131025011112_create_author_books.rb 迁移示例:

class CreateAuthorBooks < ActiveRecord::Migration
  def change
    create_table :author_books, :id => false do |t|
      t.belongs_to :author  #this is the MODEL name
      t.belongs_to :book   #this is the MODEL name
    end
    add_index :author_books, [:author_id, :book_id], :unique => true   #This is the database table name!!
  end
end

我希望能节省一些时间!