0

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

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

4

1 回答 1

0

我在这里发布了这个问题,因为它不是很明显。所以我想确定其他人是否也在同一个泡菜中,这有望帮助他们。

因此,对于那些刚接触 Rails 的人来说,首先使用 Rails。当您生成模型(例如“Story”)时,生成器会在为数据库创建表名(例如“故事”)时将模型复数。因此,例如,当我运行“rails g model author_book”时,模型最终称为 AuthorBook,rails 将表命名为 author_books。

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

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

因此,例如,假设我们有 Books 和 Authors 以及它们之间的关系。以下是它们在 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

应用程序/模型/作者.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

我希望这可以节省别人一些时间!

于 2013-10-28T09:49:28.060 回答