gpt4 book ai didi

sql - 关联记录的最大数量

转载 作者:行者123 更新时间:2023-12-02 02:26:56 25 4
gpt4 key购买 nike

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

我如何执行此规则?

到目前为止,我能想出的唯一解决方案是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/

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