Tôi đang xây dựng một nền tảng viết lách hợp tác. Người dùng có thể có các bộ vật phẩm và bất kỳ vật phẩm nào trong đó đều có thể nằm trong bất kỳ bộ nào và thuộc về bất kỳ người dùng nào. Nhưng điều này có thể gây ra một số vấn đề.
Đây là những mối quan hệ kiểu mẫu của tôi:
Hiệp hội lớp < ActiveRecord::Base
thuộc về :người dùng
thuộc về :set
thuộc về :item
end
Tập lớp < ActiveRecord::Base
has_many :hiệp hội
has_many :users, thông qua: :associations
has_many :items, thông qua: :associations
end
Mục lớp < ActiveRecord::Base
has_many :hiệp hội
has_many :users, thông qua: :associations
has_many :sets, through: :associations
end
Tôi không thể nghĩ ra "đường ray" để xử lý việc này đúng cách.
Câu hỏi 1:
Khi tạo một dự án mới, chỉ liên kết bộ sưu tập/dự án được lưu trữ chứ không phải người dùng:
lớp ItemController < ApplicationController
def create
@set = current_user.sets.find(params[:set_id])
@set.where(title: params[:item][:title]).first_or_create!
end
end
*gia hạn*
Để giải quyết vấn đề 1, cách tốt nhất tôi có thể nghĩ đến là làm như sau:
@set = current_user.sets.find(params[:set_id])
@item = Item.where(name: params[:item][:title]).first_or_create!
Association.where(item_id: @item.id, set_id: @set.id, user_id: current_user.id).first_or_create!
Mặc dù cảm thấy rất không ổn!
Câu hỏi 2:
Giả sử bảng liên kết được điền chính xác từ câu hỏi 1, Bộ điều khiển sau sẽ trả về tất cả các mục thuộc sở hữu của bộ sưu tập, nhưng bỏ qua quyền sở hữu của người dùng:
lớp SetsController < ApplicationController
chỉ số chắc chắn
@sets = current_user.sets.includes(:items)
end
end
*gia hạn*
Vẫn không có may mắn tìm được câu trả lời cho câu hỏi này. Để giải thích vấn đề tốt hơn:
Sau đây sẽ chỉ trả về các bộ sưu tập thuộc về người dùng hiện tại
@sets = current_user.sets.all
Tuy nhiên, phần sau đây sẽ chỉ trả về bộ sưu tập của người dùng nhưng sẽ bao gồm tất cả các mục của bộ sưu tập, ngay cả khi chúng không thuộc về người dùng hiện tại. Nói cách khác, phạm vi người dùng bị loại bỏ.
@sets = current_user.sets.includes(:items)
Tôi đã cố gắng giải quyết vấn đề này cả ngày nhưng dường như không tìm ra manh mối
Tôi là một lập trình viên xuất sắc, rất giỏi!