- 作为用户,我可以将我最喜欢的书添加到我的书单中。
- 另一个用户将同一本书添加到他们的书单中。
数据库中应该只有一个图书实例,但有 2 个用户/图书关联。
class User has_many :bookReferences has_many :books, through: :bookReferences class Book validates_uniqueness_of :title has_many :bookReferences has_many :users, through: :bookReferences class BookReference belongs_to :user belongs_to :book
第一个问题是,如果这本书已经在系统中,则不会为第二个用户创建 bookReference,因为这本书不是唯一的。
所以,如果这本书已经在系统中,我只想在 bookReference 表中创建关联记录。
第二个问题,当用户删除一本书时,我只希望它删除对该书的引用,除非他们是唯一引用该书的用户。
基本上,这是我试图实现的用法的完整概述:
user1.books.first
=> id: 1, title: "Moby Dick"
user2.books.first
=> id: 1, title: "Moby Dick"
books.all
=> id: 1, title: "Moby Dick"
user1.books.first.destroy
user1.books.first
=> nil
books.all
=> id: 1, title: "Moby Dick"
user2.books.first
=> id: 1, title: "Moby Dick"
user2.books.first.destroy
=> nil
books.all
=> nil
更新
基于这些答案,也许我不是很清楚。让我再试一次... book 控制器有一个基本的 CRUD 创建方法:
def create
current_user.books.create(name: params[:book][:title])
通过目前设置 has_many through 关联的方式,只有当它是唯一的时才会创建这本书。如果它已经在系统中,它将返回 false。我想要它做的是创建与现有书籍的关联,就好像它是一个新记录一样。这是我目前在我的应用程序中为实现此目的所做的,但感觉不对:
def create
book = Book.where(name: params[:book][:title]).first_or_create!
BookReference.where(book_id: book.id, user_id: current_user.id).first_or_create!
然后第二个问题是当用户从他们的帐户中删除一本书时。执行传统的 CRUD 销毁将从所有帐户中删除它:
def destroy
book = current_user.books.find(params[:id])
book.destroy
所以为了解决这个问题,我目前正在做以下事情。再一次,这感觉不“正确”:
def destroy
book = current_user.books.find(params[:id])
# if book was unique to user
if BookReference.where(book_id: book.id).count == 1
# remove book from system
book.destroy
else
# remove book reference but not book
current_user.books.delete(book)
end
end