Rails:两个模型之间的两个不同的多对多关系
Rails: Two different many to many relationships between two models
我有两个 table,名为 books (id, name, author_name)
和 users (id, name, location)
。一本书既可以由用户查看,也可以由用户编辑。因此,对于这两个关系,我有两个连接 tables 即。 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
我写过的Join模型有:
class BookEditorUser < ActiveRecord::Base
belongs_to :book
belongs_to :user
end
class BookViewerUser < ActiveRecord::Base
belongs_to :book
belongs_to :user
end
我想到了另一种解决方法,但我不确定它是否是 Rails 方法。解决方法是使用一个连接 table book_users (book_id, user_id, type)
,其中类型列可以捕获是编辑者关系还是查看者关系。
单一加入 table(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
我有两个 table,名为 books (id, name, author_name)
和 users (id, name, location)
。一本书既可以由用户查看,也可以由用户编辑。因此,对于这两个关系,我有两个连接 tables 即。 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
我写过的Join模型有:
class BookEditorUser < ActiveRecord::Base
belongs_to :book
belongs_to :user
end
class BookViewerUser < ActiveRecord::Base
belongs_to :book
belongs_to :user
end
我想到了另一种解决方法,但我不确定它是否是 Rails 方法。解决方法是使用一个连接 table book_users (book_id, user_id, type)
,其中类型列可以捕获是编辑者关系还是查看者关系。
单一加入 table(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