gpt4 book ai didi

ruby-on-rails - Rails 5 - 在编辑操作中使用范围来查找特定实例的相关子项

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

我正在尝试学习如何在我的 Rails 5 应用程序中使用作用域。

我问了一个背景问题here .

在我的 Rails 5 应用程序中有用户、提案和潜力模型。

用户创建他们自己和其他人可以在其上发表评论的提案。

模型之间的关联是:

用户

  has_many :proposals, dependent: :destroy
has_many :potentials

提案

belongs_to :user
has_many :potentials, inverse_of: :proposal
accepts_nested_attributes_for :potentials, reject_if: :all_blank, allow_destroy: true

潜力

belongs_to :proposal, inverse_of: :potentials
belongs_to :user

在我的路线文件中,我有两个潜力资源。我不确定我是否用这个位离开了滑雪道——我找不到一个例子来说明如何做到这一点。我有两个:

resources :potentials

还有:

resources :proposals do

resources :potentials

目标:

当提出建议的用户尝试对其进行编辑时,我只希望该用户能够编辑他们自己创建的潜力。

我为潜力设置了两条路线的原因是嵌套资源在提案表单中有一个嵌套的表单字段,因此提案创建者可以通过这种方式创造潜力。任何其他看到提案并有潜力的用户都可以通过单独的表格来完成。

任何用户(包括提案创建者,都可以通过该单独的表格编辑潜力),提案创建者也可以通过提案表格中的嵌套表格编辑自己的任何提案。

目前,每当我编辑提案表格时(即使我不编辑潜在的嵌套字段),所有的潜力都会更新以插入提案创建者的用户 ID,覆盖实际的潜在创建者的用户 ID。

解决方案

我正在尝试限制提案 Controller 中的编辑操作,以便它只允许编辑具有 user_id == proposal.user_id 的提案/potentials。

为此,我在 proposal.rb 中写了作用域

scope :owner_potentials, ->{ where(user_id: potential.user_id ) }
scope :third_party_potentials, ->{ where(user_id: != potential.user_id) }

我喜欢上面的帖子中的解决方案是尝试使用示波器。由于作用域是为了在类上工作,而不是在实例上工作,我一直在试图弄清楚如何调整它们,以便我可以使用作用域来搜索所有兼容的潜力(即 potential.user_id = = proposal.user_id)。这意味着我不是在搜索提案类,而是在搜索特定的提案。

This post建议在相关 Controller 操作中定义 Event.all,但我将如何限制它,使其仅适用于特定的电位编辑行?我的编辑操作中还有其他行不应在提案表上进行测试,而应仅在实例上进行测试。如果这能够奏效,我想我将需要重写我的范围以尝试排除所有其他提案。

有没有办法在特定实例的具有范围的 Controller 中使用编辑操作?

最佳答案

我会建议这样的范围:

scope :owner_potentials, -> (user_id) { where(user_id: user_id) }
scope :third_party_potentials, -> (user_id) { where.not(user_id: user_id) }

调用这些范围时,您只需传递当前用户的 ID。

关于ruby-on-rails - Rails 5 - 在编辑操作中使用范围来查找特定实例的相关子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41772669/

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