在Rails中做多对多的正确方法是什么?
我浪费了一点时间来解决这个问题的微妙之处,所以我想我会在这里发布问题和答案,以防止其他人节省一些时间。
答案 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
我希望能节省一些时间!