Rails:如何限制 has_many 关联中的项目数量(来自父级)

2024-04-04

我想限制协会中的项目数量。我想确保用户拥有的东西不超过 X 件。这个问题之前被问过 https://stackoverflow.com/questions/7863618/rails-3-1-limit-user-created-objects解决方案有孩子的逻辑:

提供的解决方案(针对类似问题):

class User < ActiveRecord::Base
  has_many :things, :dependent => :destroy
end

class Thing <ActiveRecord::Base
  belongs_to :user
  validate :thing_count_within_limit, :on => :create

  def thing_count_within_limit
    if self.user.things(:reload).count >= 5
      errors.add(:base, "Exceeded thing limit")
    end
  end
end

硬编码的“5”是一个问题。我的限制根据父母的变化而变化。事物的集合知道其相对于用户的限制。在我们的例子中,管理者可以调整每个用户的(事物)限制,因此用户必须限制其事物的集合。我们could让 thing_count_within_limit 向其用户请求限制:

if self.user.things(:reload).count >= self.user.thing_limit

但是,那是很多user来自事物的内省。多次致电用户,尤其是(:reload)对我来说是危险信号。

对更合适解决方案的思考:

我想has_many :things, :before_add => :limit_things可以,但是我们必须提出一个例外停止链条 http://guides.rubyonrails.org/association_basics.html。这迫使我更新 things_controller 来处理异常,而不是按照 Rails 约定if valid? or if save.

class User
  has_many :things, :before_add => limit_things

  private
  def limit_things
    if things.size >= thing_limit
      fail "Limited to #{thing_limit} things")
    end
  end
end

这是铁轨。如果我必须这么努力工作,我可能做错了什么。

为此,我必须更新父模型、子控制器,并且我不能遵循约定?我错过了什么吗?我是否滥用has_many, :before_add?我寻找使用 :before_add 的示例,但找不到任何示例。

我考虑过将验证移至用户,但这仅发生在用户保存/更新时。我看不出有什么方法可以用它来阻止添加事物。

我更喜欢 Rails 3 的解决方案(如果这对这个问题很重要的话)。


因此,如果您想为每个用户设置不同的限制,您可以将 things_limit:integer 添加到 User 中并执行

class User
  has_many :things
  validates_each :things do |user, attr, value|
   user.errors.add attr, "too much things for user" if user.things.size > user.things_limit
  end
end

class Thing
  belongs_to :user
  validates_associated :user, :message => "You have already too much things."
end

使用此代码,您无法将 user.things_limit 更新为低于他已经获得的所有事物的数字,当然它限制用户通过他的 user.things_limit 创建事物。

Rails 4 应用示例:

https://github.com/senayar/user_things_limit https://github.com/senayar/user_things_limit

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

Rails:如何限制 has_many 关联中的项目数量(来自父级) 的相关文章

随机推荐

  • .NET 有没有好的图像识别库?

    我希望能够将网络摄像头拍摄的图像与计算机上存储的图像进行比较 该库不需要百分百准确 因为它不会用于任何关键任务 例如警方调查 我只想要一些我可以使用的东西 我尝试过一个演示项目CodeProject 的图像识别 http www codep
  • CUDA错误:在python中使用并行时初始化错误

    我的代码使用 CUDA 但运行速度仍然很慢 因此 我将其更改为使用 python 中的多处理 pool map 并行运行 但我有CUDA ERROR initialization error 这是函数 def step M self ite
  • 以 Fortran 连续顺序重塑 numpy.array

    我有一个如下所示的数组 from numpy import a array 1 2 3 4 5 6 7 8 9 我想得到如下结果 1 4 7 2 5 8 3 6 9 因为我有一个很大的数组 所以我需要一种有效的方法来做到这一点 最好就地重塑
  • 来自 Blackberry Phonegap 应用程序的 Ajax 请求

    我正在为 Blackberry 操作系统 5 0 及更高版本 创建一个应用程序 我过去没有任何移动开发经验 我创建了一个运行良好的示例应用程序 按照中提到的准则http wiki phonegap com w page 31930982 G
  • 基于 php 示例的 C++ 中数据结构的多态性示例

    我正在学习多态 并且熟悉php 我发现了这个很好的例子https stackoverflow com a 749738 80353 https stackoverflow com a 749738 80353 转载如下 如何用 C 编写相同
  • 调用 C 子例程时出现 JNI 错误

    我想从 Java 调用 C 子例程 我正在使用 JNI 我创建了 java c 和 h 文件 并编译了 DLL 所有文件都在同一个文件夹中 但是当我运行该程序时 它显示unsatisfiedlinkError 我哪里出错了 在学习JNI时
  • 更新某些类别的左列/如何在布局文件中设置类别 ID

    我想要一个在左侧显示某些类别幻灯片的块 但是 我通过引用布局文件中的左列 在所有页面中显示了幻灯片放映块 我们需要幻灯片仅出现在左侧的某个类别 id 225 中 到目前为止我的解决方案路线图 1 将特定类别 url 重写到我的自定义模块 控
  • Xcode 4.5 无法在模拟器或设备上运行/加载应用程序

    我在 2007 年中的 Mac Mini 上运行 OS X Lion 10 7 5 上的 Xcode 4 5 我之前遇到过这个问题 当我构建时 模拟器和实际设备都不会运行应用程序 我正在使用 Phonegap 2 1 HTML JS Jqu
  • Recharts CompedChart 从零开始 X 轴刻度

    我正在使用 ComdedChart 和 shoing 条形图和线条 通常该线应从 x 轴的 0 处开始 但是当使用组合图表时无法做到这一点 如果您在上图中观察到勾选a应该从 x 轴开始 x 轴和 y 轴开始的 0 点 但事实并非如此 这是我
  • Matlab - 多维数据的PCA分析与重构

    我有一个大型多维数据集 132 维 我是数据挖掘的初学者 我想使用 Matlab 来应用主成分分析 不过 我看到网上有很多功能解释 但我不明白它们应该如何应用 基本上 我想应用 PCA 并从我的数据中获取特征向量及其相应的特征值 在此步骤之
  • 使用 XIB 实例化视图

    我有一个按照以下指南创建的 xib 如何创建自定义 iOS 视图类并实例化它的多个副本 在 IB 中 https stackoverflow com questions 9251202 how do i create a custom io
  • 如何在R中处理hdf5文件?

    我有一个文件在hdf5格式 我知道它应该是一个矩阵 但我想在其中读取该矩阵R这样我就可以研究它 我看到有一个h5r包应该有助于解决这个问题 但我没有看到任何简单易读 理解的教程 网上有这样的教程吗 具体来说 你如何阅读hdf5这个包的对象
  • 使用 REST API 更新 JIRA 票证状态

    我可以使用 CURL 命令并方便地使用 json 数据在 JIRA 中创建票证 curl D u X POST data H Content Type application json http rest api 2 issue 我现在尝试
  • 为什么 pack 和 grid 会覆盖父窗口小部件的预定义尺寸?

    我注意到每次创建 Tkinter 小部件并在小部件实例化期间或通过设置其尺寸时配置 http effbot org tkinterbook tkinter widget configuration htm稍后添加 一旦我添加 最后这些就不会
  • 这里使用持久ID来解决什么pickle问题?

    From https docs python org 3 library pickle html persistence of external objects https docs python org 3 library pickle
  • 如何定义分层数据结构的DDD聚合根?

    我目前正在尝试将领域驱动设计原则应用于我的开发实践 我一直致力于如何为按层次结构组织的数据定义聚合根 我们以文件夹结构为例 每个文件夹可以有 0 N 个子文件夹 子文件夹 0 N 也可以有 0 N 个子文件夹 依此类推 我对文件夹及其所有直
  • 将标签分配给相应的网格单元

    我从头开始编写了一个 YOLO 模型 并有一个 numpy 数组 如下所示 1 0 1 0 4 0 3 0 2 0 1 1 1 0 0 2 0 3 0 4 0 5 0 0 0 0 0 0 0 这就是它在 pandas 对象中的样子 Obj
  • 导入错误:无法导入名称“语言”

    我正在尝试运行 python 脚本 但收到此错误 from iso639 import languages ImportError cannot import name languages 我已经安装了iso639 但仍然出现此错误 任何想
  • 如何在 PHP 中从 ipinfo.io 获取位置?

    我在用ipinfo io http ipinfo io使用 PHP 获取我当前的城市 位置 但是 使用这段代码时我无法看到我的城市 ipaddress SERVER REMOTE ADDR function ip details ip js
  • Rails:如何限制 has_many 关联中的项目数量(来自父级)

    我想限制协会中的项目数量 我想确保用户拥有的东西不超过 X 件 这个问题之前被问过 https stackoverflow com questions 7863618 rails 3 1 limit user created objects