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

2024-03-28

我正在尝试学习如何在 Rails 5 应用程序中使用范围。

我问了一个背景问题here https://stackoverflow.com/questions/41755032/rails-5-exclude-specific-instances-from-edit-path-on-parent-controller.

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

用户创建提案,然后他们自己和其他人可以对其发表评论。

模型之间的关联是:

User

  has_many :proposals, dependent: :destroy
  has_many :potentials

Proposal

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。

Solution

我试图限制提案控制器中的编辑操作,以便仅允许编辑提案/潜力(如果它们具有 user_id == props.user_id)。

为此,我在我的proposal.rb中编写了范围

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

我喜欢上面的帖子中的解决方案是尝试使用范围。由于作用域是用于类而不是实例,所以我一直在尝试找出如何调整它们,以便我可以使用作用域来搜索所有合规的电位(即势能.user_id = = 提案.user_id)。这意味着我不是搜索提案类,而是搜索具体提案。

这个帖子 https://stackoverflow.com/questions/10413058/rails-scopes-undefined-methods建议在相关控制器操作中定义 Event.all ,但是我该如何限制它,使其仅应用于特定的电位编辑行?我的编辑操作中有其他行不应在提案表上进行测试,而应仅在实例上进行测试。如果这能够奏效,我想我将需要重写我的范围以尝试排除所有其他提案。

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


我建议这样的范围:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Android 通用 AsyncTask 类

    我看过这个答案 由于 AsyncTask 是一个单独的类 如何将 OnPostExecute 的结果获取到主活动 https stackoverflow com questions 12575068 how to get the resul
  • AngularJS ng-repeat 通过复杂和动态的 JSON 数组

    我正在尝试使用 JSON 数组向用户显示内容ng repeat选项 这JSON Array是动态创建的 所以我有点困惑如何向用户显示相同的内容 的语法JSON ARRAY内容如下COMPLEX key可以动态增加或减少 jsonList n
  • ASP.Net core-从中间件获取routetemplate值

    我有一个中间件 每次对我的 API 发出请求时都会调用该中间件 我想记录路由模板以及来自该中间件的请求的持续时间 如何在我的中间件代码中获取路由模板 路由模板类似于 products productId 这是我如何让它发挥作用的 我在过滤器
  • 如何使用 Python 和 Django 创建 SaaS 应用程序

    您能给我一些建议 让您可以使用 Python 和 Django 创建 SaaS 软件即服务 应用程序吗 目前我不明白的一般主题是 您是否为所有客户提供一个可用的应用程序 或者为每个客户提供一个应用程序 如何管理每个客户端的数据库访问 权限或
  • 原生原型与 $.extension()

    在工作中 我们使用 jQuery 在我们开始使用它后不久 我看到几个开发人员正在向文件 jquery extensions js 添加函数 在里面 我发现添加了一大堆方法 这本质上相当于 jQuery 上的静态方法 这里有一些 format
  • Apache 目录 LDAP - 分页搜索

    我一直在寻找使用 Apache Directory API 执行分页搜索的信息 但我没有找到任何示例或任何有关如何使用正确的 PagedResults 控件构建 SearchRequest 然后执行搜索的信息 你们有什么建议吗 或者知道哪里
  • TextToSpeech 改变声音

    我希望能够更改文本转语音 API 中的语音 例如更改 声音由女声转为男声 让声音更清晰 改变语速 请有人让我知道这是否可能 谢谢 您可以通过以下方式为特定字符串提供自己的转换addSpeech 不过 AFAICT 没有文档说明如何替换自己的
  • 如何构建这个项目? (jpeg 库)

    Edit 我现在正在使用http code google com p jpeg compressor http code google com p jpeg compressor 所以我不再关心让这个工作了 我下载了http ijg org
  • 从日语 IME 获取更多数据

    在我的 C 表单中 我有一个数据网格视图 我想在其中输入单词或句子的汉字和假名版本 并将它们放在不同的列中 例如 転寝 寝坊 我想要实现的是当我提交第一列时自动填充第二列 我知道有一些词典包含汉字读法 但对于句子来说它会变得复杂 而且还有很
  • 使用 VisualVM 和 JMX 进行远程监控

    我想使用 jvisualvm 或 jconsole 监视远程运行的 java spring boot 应用程序 在本地运行时 我可以在 jvisualvm 和 jconsole 中看到托管 bean 远程运行时我无法连接 我用几个不同的ja
  • 得到一个名为保留字的Oracle表,可能会出现哪些问题?

    我们刚刚外包了一个系统 乍一看我可以看到一些名称为 CASE 或 FROM 的表和字段 它是一个 Oracle 10g DB 我们将使用来自 Java Hibernate C C 的这些数据 有什么特别我们应该注意的吗 对于我在其他帖子中看
  • jQuery:一年中的一周脚本正在运行

    不久前我需要一个脚本来每周更新一些内容 我的问题在这个论坛 https stackoverflow com questions 3701276 jquery update content every week or long period
  • CMS 软件中的空白 index.html 而不是 .htaccess

    我注意到 Joomla Wordpress 和其他 CMS 在其所有子文件夹中都有空白的 index html 文件 以防止人们窥视文件夹结构 我的问题是为什么他们不能禁止使用 htaccess 文件查看文件夹 而不是将空白的 index
  • 多个 goroutine 的 Go 内存消耗

    我试图检查 Go 在 100 000 个 goroutine 上的表现如何 我编写了一个简单的程序来生成许多例程 除了打印一些公告之外什么也不做 我将 MaxStack 大小限制为仅 512 字节 但我注意到程序大小并没有随之减小 它消耗了
  • 从运行脚本阶段获取当前方案名称

    有没有办法从运行脚本阶段获取当前方案 我试过了 SCHEME NAME 但它不存在 我找不到要使用的环境变量 因此我必须开发一种解决方法 将方案名称写入磁盘建立预行动然后将其读回运行脚本 phase 对于您感兴趣的每个方案 请访问编辑方案并
  • LibGDX:如何使平铺地图图块可点击?

    如何为平铺地图中的图块添加点击侦听器 以便当您用鼠标选择图块时它会突出显示 libGDX 不直接支持这一点 因为 TiledMap 内容仅用于渲染 您可以轻松创建一个Stage不过 它将充当 TiledMap 的某种覆盖输入层 只需创建一个
  • 线程中的 GLib GMainContext?

    我在堆栈溢出上搜索以找到与我的问题相关的答案 但我没有找到任何答案 我有一个启动线程的主线程 我的 main 函数 新线程运行 GMainLoop 在我的主要功能中 我不断通过调用添加源g io watch一些文件描述符 但如果事件被调度
  • Python 日志记录和子进程输出以及错误流

    我想启动一个 python 进程并将子进程错误消息记录到父脚本的日志记录对象中 理想情况下 我希望将日志流统一到一个文件中 我可以以某种方式访问 日志记录类的输出流吗 我知道的一种解决方案是使用 proc log 进行日志记录 正如下面的答
  • 如何每天在特定时间触发 akka 调度程序?

    我创建了一个 Akka 的调度程序 每天在固定时间发送邮件 例如每天上午 6 00 那么如何称呼演员呢 我的意思是我应该使用什么逻辑 谢谢 只需计算现在和接下来的下午 6 点之间的差异 将其作为初始延迟 然后每 24 小时重复一次
  • Rails 5 - 在编辑操作中使用范围来查找特定实例的相关子项

    我正在尝试学习如何在 Rails 5 应用程序中使用范围 我问了一个背景问题here https stackoverflow com questions 41755032 rails 5 exclude specific instances