我想在一个模型上有最大数量的关联记录。
例如。一个项目有_许多任务,但不超过二十个。
我如何执行此规则?
到目前为止,我能想出的唯一解决方案是INSERT INTO...SELECT
像这样查询:
INSERT INTO
tasks (`id`,`project_id`,`title`,`body`)
SELECT
NULL, ?, ?, ?
FROM
tasks
HAVING
count(id) < MAX_NUMBER_OF_TASKS
LIMIT 1;
插入新记录?
我目前正在使用自定义方法
ActiveRecord::Base.connection
并调用它而不是 .create
或 .save
当new_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/