mysql - Datamapper 独特约束和偏执删除

标签 mysql ruby datamapper unique-constraint

我有一个带有几个字段和唯一约束的数据映射器对象。实际上,这确保了每个用户 ID 每个日期代码只能创建一条记录。

class Form
  include Datamapper::Resource
  property :id, Serial
  property :username, String, :required => true, :index => true
  property :termcode, Integer, :required => true
  property :status, Enum[:draft, :review, :approved, :denied], :default => :draft
  ...

  property :deleted_at, ParanoidDateTime

  # only one record per user per term code
  validates_uniqueness_of :username, :scope => [:termcode], :unless => lambda{|r| r.status == :draft }

end

问题是,如果我使用偏执删除功能,唯一性约束会阻止使用相同数据创建其他记录。

例如,如果 Sue 为“2015”学期代码创建一条记录并将其删除,则她将无法创建具有相同学期代码的新记录,因为偏执功能会将原始记录保留在数据库中。

出于数据完整性目的,此模型的字段是必需的,并且在许多情况下也需要建立索引,以便进行排序和更好的查询优化。

如何利用安全删除,同时允许用户输入更多记录,但告诉唯一约束忽略已删除的记录?

最佳答案

您应该创建一个方法并在创建之前和保存之前注册它 as a hook .

This is basically the same way the paranoid types operate.

关于mysql - Datamapper 独特约束和偏执删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22720930/

相关文章:

与加载数据infile一起使用的mysql触发器

mysql - 表中不存在键列

ruby-on-rails - 安装mysql(2.9.1)时出错,Bundler无法继续

ruby-on-rails - 为什么这个数据映射器对象不保存?

ruby - 通过关联查找(Datamapper)

MySQL 具有来自另一个表的 ON 条件

php - PDO fetch() 是否在失败时抛出异常?

ruby - 在 Ruby 中,如何在不将短语拆分为单词和丢失单词分隔符的情况下从短语中删除数字单词?

ruby-on-rails - 当我需要 UTF-8 时,Rails 应用程序一直以 ASCII-8BIT 生成 View ?

php - Zend Framework应用层Master/Slave切换