Rails:两个模型之间有两个不同的多对多关系

时间:2015-01-17 02:59:00

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有两个名为books (id, name, author_name)users (id, name, location)的表。书籍既可以由用户查看,也可以由用户编辑。所以,对于这两个关系,我有两个连接表即。 book_editor_users (book_id, user_id)book_viewer_users (book_id, user_id)。 我如何在Rails中对此进行建模,以便我可以检索编辑器用户和查看器用户:

Book.find(1).book_editor_users
Book.find(1).book_viewer_users

我对书籍和用户模型的尝试是:

class Book < ActiveRecord::Bas
  has_many :book_editor_users
  has_many :users, through: :book_editor_users
  has_many :book_viewer_users
  has_many :users, through: :book_viewer_users # I am confused on how to setup this line
end

class User < ActiveRecord::Base
  has_many :books, through: :book_editor_users
  has_many :books, through: :book_viewer_users # I am confused here too
end

加入我写的模型是:

class BookEditorUser < ActiveRecord::Base
  belongs_to :book
  belongs_to :user
end

class BookViewerUser < ActiveRecord::Base
  belongs_to :book
  belongs_to :user
end

我想到了另一项工作,但我不确定它是否是Rails方式。解决方法是使用单个连接表book_users (book_id, user_id, type),其中类型列可以捕获它是编辑器关系还是查看器关系。

1 个答案:

答案 0 :(得分:1)

单个连接表(books_users)是使用权限列执行此操作的最佳方式。让我们说整数列为1用于视图2进行编辑(如果它可能是可能的话,则为3)。要获得编辑或查看者用户,您应该在他们的加入模型(BooksUsers)中编写范围

scope :viewers, -> { where(permission: 1) }
scope :editors, -> { where(permission: 2) }

现在您可以从这些范围中找到特定用户的书籍

Book.find(1).books_users.viewers
Book.find(1).books_users.editors