sql - 关联记录的最大数量

标签 sql ruby-on-rails ruby-on-rails-3 activerecord

我想在一个模型上有最大数量的关联记录。
例如。一个项目有_许多任务,但不超过二十个。

我如何执行此规则?

到目前为止,我能想出的唯一解决方案是INSERT INTO...SELECT像这样查询:

INSERT INTO
  tasks (`id`,`project_id`,`title`,`body`)
SELECT
  NULL, ?, ?, ?
FROM
  tasks
HAVING
  count(id) < MAX_NUMBER_OF_TASKS
LIMIT 1;
  • 据我所知,这将保证最大数量的任务被插入。我在这方面正确吗?
  • 有没有一种“Rails 方式”可以做到这一点?
  • 是否可以覆盖 ActiveRecord/任务模型,以便它使用上面的查询
    插入新记录?

  • 我目前正在使用自定义方法 ActiveRecord::Base.connection并调用它而不是 .create.savenew_record? == true .

    最佳答案

    我一直无法尝试这个,但我不明白为什么它不应该工作。

    第一步:在父对象上定义一个验证器(这是一个简单的实现 - 可以/应该变得更通用):

    class Project < ActiveRecord::Base
      validate :max_tasks
    
      def max_tasks
        if tasks.count > 20
          errors.add_to_base("Should not have more than 20 tasks")
        end
      end
    end
    

    第二步:从任务开启项目验证:
    class Task < ActiveRecord::Base
      validates_associated :project
    end
    

    我认为你应该做生意。当您尝试保存新任务时,它将验证关联的项目,如果(现在)关联的任务超过 20 个,则验证将失败。

    以防万一您想让它更通用,您可以执行以下操作:
    class NumberOfAssociatedValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        if options[:maximum] && record.send(attribute).count > options[:maximum]
          record.errors[attribute] << "must not have more than #{options[:maximum]}"
        end
        if options[:minimum] && record.send(attribute).count < options[:minimum]
          record.errors[attribute] << "must not have less than #{options[:minimum]}"
        end
      end
    end
    
    class MyModel < ActiveRecord::Base
      validates :my_association, :number_of_associated => {:maxiumum => 20}
    end
    

    关于sql - 关联记录的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5577562/

    相关文章:

    ruby-on-rails-3 - Rails/ActiveModel 将参数传递给 EachValidator

    database - 创建一个 Ruby gem 以从多个 Rails 应用程序访问第二个数据库

    ruby-on-rails - 用于谷歌地图集成的 Ruby on Rails gem

    sql - 基本 Postgres : How do I insert a value into all rows?

    ruby-on-rails - mongoid as_document 错误

    ruby-on-rails - Rails 抓取价格

    ruby-on-rails - OmniAuth Google OpenID WEBrick::HTTPStatus::RequestURITooLarge

    sql - Ruby on Rails 搜索查询两个表

    mysql - 在一张表中按月份获取多个值的总和

    mysql - 默认以降序加载 Datagrip 表