gpt4 book ai didi

ruby-on-rails - 多个 has_many 通过关系

转载 作者:太空宇宙 更新时间:2023-11-03 17:56:30 25 4
gpt4 key购买 nike

我正在建立一个协作写作平台。用户可以拥有项目集,其中任何项目都可以在任何集中并属于任何用户。但这会导致一些问题。

这些是我的模型关系:

class Association < ActiveRecord::Base
belongs_to :user
belongs_to :set
belongs_to :item
end

class Set < ActiveRecord::Base
has_many :associations
has_many :users, through: :associations
has_many :items, through: :associations
end

class Item < ActiveRecord::Base
has_many :associations
has_many :users, through: :associations
has_many :sets, through: :associations
end

我想不出正确处理这个问题的“rails 方式”。

问题 1:

创建新项目时,仅存储集合/项目关联而不存储用户:

class ItemsController < ApplicationController
def create
@set = current_user.sets.find(params[:set_id])
@set.where(title: params[:item][:title]).first_or_create!
end
end

*更新*

要解决问题 1,我能想到的最好办法是执行以下操作:

@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!

虽然感觉很不对劲!

问题 2:

假设从问题 1 中正确填充关联表,以下 Controller 将返回集合拥有的所有项目,但忽略用户所有权:

class SetsController < ApplicationController
def index
@sets = current_user.sets.includes(:items)
end
end

*更新*

仍然没有运气找到这个问题的答案。为了更好地解释这个问题:

以下将只返回属于当前用户的集合

@sets = current_user.sets.all

但是,以下将仅返回用户的集合,但将包括集合的所有项目,即使它们不属于当前用户也是如此。换句话说,用户范围被删除。

@sets = current_user.sets.includes(:items)

我一整天都在尝试解决这个问题,但似乎找不到线索

最佳答案

您的第一个问题是确保您的实例变量相同。一种是大写。应该看起来像这样:

class ItemsController < ApplicationController
def create
@set = current_user.sets.find(params[:set_id])
@set.where(title: params[:item][:title]).first_or_create!
end
end

关于ruby-on-rails - 多个 has_many 通过关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com