在 Rails 中做多对多的正确方法是什么?
我在其中的微妙之处浪费了一些时间,所以我想我会在这里发布问题和答案,以防其他人节省一些时间。
我在这里发布了这个问题,因为它不是很明显。所以我想确定其他人是否也在同一个泡菜中,这有望帮助他们。
因此,对于那些刚接触 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
我希望这可以节省别人一些时间!